【问题标题】:How to run google chrome headless in docker?如何在 docker 中无头运行谷歌浏览器?
【发布时间】:2017-09-25 16:35:15
【问题描述】:

我的问题是如何在 docker 容器中运行 google chrome 进行 e2e 测试。 我从官方 Jenkins 图像创建了一个 Dockerfile,但是当尝试运行 google chrome 时,它​​崩溃并显示错误:

Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted
Trace/breakpoint trap (core dumped)

Jenkins docker 镜像使用 Debian jessie

我可以使用--headless 标志运行google chrome,并且不需要X 服务器。

这是我的 docker 文件:

Jenkins 官方图片:

一个人使用 docker 的 GUI 运行 google chrome 的 repo:

我的第一种方法是使用xvbf,但使用--headless标志时过程更简单。

我可以在 Ubuntu 服务器中使用相同的安装命令运行 chrome,但在 docker 中它会失败。

在其他意图之后,我使用了--no-sandbox 标志,但 docker images 显示下一个错误。

[0427/180929.595479:WARNING:audio_manager.cc(295)] Multiple instances of AudioManager detected
[0427/180929.595537:WARNING:audio_manager.cc(254)] Multiple instances of AudioManager detected
libudev: udev_has_devtmpfs: name_to_handle_at on /dev: Operation not permitted

实际上我运行了这个命令:

google-chrome-stable --headless --disable-gpu --no-sandbox http://www.google.com

【问题讨论】:

  • 很想拥有这个,尤其是现在google-chrome-beta(版本 59)已经发布。我已经尝试启动并运行它并遇到相同的问题。
  • 您是否尝试使用所有这些标志运行它? google-chrome-unstable --disable-gpu --headless --user-data-dir=/var/jenkins_home/chrome-data
  • 这就是我在 Docker 中运行 C# 应用程序 + Selenium 的方式:Other question, same answer

标签: google-chrome docker jenkins e2e-testing


【解决方案1】:

我没有答案,但我知道一个容器可以在 Docker 中成功启动无头 Chrome。硒一:

Selenium Chrome Node

我用它在 Chrome 中自动测试我的 web 应用

希望对你有帮助

【讨论】:

  • 你使用哪个测试库?我尝试使用webdriver.io 设置mocha,但在尝试从浏览器获取值时我总是以Error: A session id is required for this command but wasn't found in the response payload 结束
【解决方案2】:

我通过以下方式扩展默认 Dockerfile Selenium Chrome Node

FROM selenium/standalone-chrome-debug:latest
MAINTAINER Serge Arbuzov <Serge.Arbuzov@advantechwireless.com>

USER root

### jenkins set up ###
RUN apt-get update && apt-get install -y openssh-server sudo
RUN mkdir /var/run/sshd
RUN adduser jenkins
RUN echo jenkins:jenkins | chpasswd
RUN echo "jenkins ALL=(ALL) NOPASSWD:ALL">>/etc/sudoers

USER root
RUN echo export DISPLAY=":1.5" >> /etc/environment
ADD run.sh /run.sh
RUN chmod +x /run.sh

EXPOSE 22

CMD ["/run.sh"]

而我的 run.sh 是

#!/bin/bash

Xvfb :1 -screen 5 1024x768x8 &
/usr/sbin/sshd -D

所以我可以使用默认图像作为 Jenkins 节点

【讨论】:

    【解决方案3】:

    使用这张图片alpeware/chrome-headless-trunk 在 ubuntu 中为我工作! 该容器中用于启动无头 chrome 的命令如下:

    /usr/bin/google-chrome-unstable \
    --disable-gpu --headless --no-sandbox \
    --remote-debugging-address=0.0.0.0 \
    --remote-debugging-port=9222 --user-data-dir=/data
    

    这里有一个关于容器运行的简短视频

    我使用以下命令在 Ubuntu 中启动了容器:

     docker run -it --rm -p=0.0.0.0:9222:9222 \ 
     --name=chrome-headless \
     -v /tmp/chromedata/:/data alpeware/chrome-headless-trunk
    

    然后使用Chrome连接到localhost:9222的调试端口

    通过一些修改,您可能可以在 Jenkins 中运行它!

    来源

    【讨论】:

    • 你添加--disable-gpu的原因是什么?
    • --no-sandbox = 巨大的安全问题
    • @Merc 是的,这是一个已知的安全问题。你有没有可以分享的不使用 --no-sandbox 的示例?
    【解决方案4】:

    只需使用 --no-sandbox 启动 chrome 即可解决问题

    【讨论】:

    • 这可能是一个严重的安全问题。这个simple post 解释了原因。 This second one explains why in details
    • 您可以使用自定义的seccomp 而不是--no-sandbox。见here
    • 只是出于好奇@CyrilN。 ...如果您在 Docker 实例中运行 Chrome,这是一种沙箱,那不会使 --no-sandbox 参数无用吗?
    • @JwJosefy 也许,我不是 Docker 专家。我认为这取决于您在 Docker 实例上运行的其他内容。如果只是 Chrome,那么我会同意,但要谨慎。
    【解决方案5】:

    我们使用 Chrome 和 Chromedriver 构建了一个 Docker 映像,该映像以无头模式运行 Chrome 以进行自动化测试。我们在docker-compose.yml 设置中使用它作为 PhantomJS 的替代品。该映像基于 Alpine Linux,不需要也不包含 Selenium,因此它非常小。

    来源: https://github.com/retreatguru/headless-chromedriver

    Docker 集线器: https://hub.docker.com/r/retreatguru/headless-chromedriver

    【讨论】:

      【解决方案6】:

      这篇文章正是我在 docker 内使用 Headless Chrome 运行 Karma 测试所需要的:

      https://hackernoon.com/running-karma-tests-with-headless-chrome-inside-docker-ae4aceb06ed3

      基本上,解决方案是使用 --no-sandbox 标志运行 Headless Chrome。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      相关资源
      最近更新 更多