在 Docker 中运行时,在 Flask 应用程序中使用 Selenium 需要 --no-sandbox

Using Selenium inside Flask App requires --no-sandbox when running in Docker

提问人:drose56 提问时间:10/2/2023 最后编辑:drose56 更新时间:10/2/2023 访问量:246

问:

我有一个 Flask 应用程序,它使用 Selenium Chrome WebDriver 登录网站并从中抓取一些敏感数据并将其安全地存储在加密文件中。一切都在本地完美运行。我正在尝试将其放入 Docker 容器中,以便它可以在另一台机器上轻松运行。我对Docker有点陌生,遇到了问题。我可以通过添加 webdriver 选项 --headless 和 --no-sandbox 来让它最终在 Docker 中工作,但我已经看过所有关于 --no-sandbox 如何危险的文章。但是,我从中抓取的单个网站是值得信赖的,我不确定 --no-sandbox 是否会构成任何威胁,除非您访问的网站可能是恶意的。不过,我确实要非常小心,因为我抓取的数据非常敏感。我已经阅读并尝试了类似文章中的答案(即使用选项“remote-debugging-port=9222”或“--crash-dumps-dir=/tmp”),但没有任何效果。我的问题是 1.对于我的用例(即访问一个受信任的网站,但处理敏感数据),不使用 --no-sandbox 有多重要,以及 2.我怎样才能绕过它?!?!?我的 Dockerfile 当前如下所示。在这一点上,我不知道还能尝试什么,任何帮助将不胜感激!

# Use the official Python image as the base image
FROM python:3.10.6
# Install necessary packages, including ChromeDriver
RUN apt-get update && apt-get install -y \
    chromium \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get autoremove -y

# Set the PATH to include ChromeDriver location
ENV PATH="/usr/lib/chromium-browser:${PATH}"
RUN mkdir /app 
COPY . /app
COPY pyproject.toml /app 
WORKDIR /app
ENV PYTHONPATH=${PYTHONPATH}:${PWD} 
RUN pip3 install poetry
RUN poetry config virtualenvs.create false
RUN poetry install --no-dev
RUN pip3 install flask

# Expose the port the application runs on
EXPOSE 8000

# Define the command to run your application
CMD ["poetry", "run", "python", "run.py", "dashboard", "start", "--host", "0.0.0.0", "--port", "8000"]

使用以下选项运行时:

        options.add_argument('--headless')  # Run in headless mode
        options.add_argument('--disable-gpu')  # Disable GPU for headless mode
        options.add_argument("--disable-dev-shm-usage")
        options.add_argument('start-maximized')
        options.add_experimental_option('excludeSwitches',
                                        ['enable-automation'])
        options.add_experimental_option('useAutomationExtension', False)

我收到错误:

回溯(最近一次调用最后一次): ... selenium.common.exceptions.SessionNotCreatedException:消息:会话未创建:Chrome 无法启动:正常退出。 (未创建会话:DevToolsActivePort 文件不存在) (从 chrome 位置 /root/.cache/selenium/chrome/linux64/117.0.5938.92/chrome 启动的进程不再运行,因此 ChromeDriver 假设 Chrome 已崩溃。

但是当我添加 --no-sandbox 选项时,一切正常。

python docker google-chrome 安全 selenium-webdriver

评论

0赞 Farkhod Abdukodirov 10/2/2023
您好,您能将您的问题清晰干净地表达出来吗~
0赞 Marek Puchalski 10/2/2023
您是否以 root 身份运行应用程序?stackoverflow.com/questions/71695438/......
0赞 drose56 10/3/2023
@MarekPuchalski我相信我是,但我无法让它在 Docker 中以非 root 身份运行
0赞 Marek Puchalski 10/3/2023
你试着做 cheatsheetseries.owasp.org/cheatsheets/ 怎么样......只要记住用 selenium 资源对整个目录进行 chmod。
0赞 drose56 10/3/2023
@MarekPuchalski,您的意思是添加诸如 COPY --chown=dylan 之类的行。/app 运行 chmod +x /app。这给了我错误virtualenv: error: argument dest: the destination 。在 /home 中不可写

答: 暂无答案