Docker X11 Forward 得到黑屏

Posted

技术标签:

【中文标题】Docker X11 Forward 得到黑屏【英文标题】:Docker X11 Forward get Blank Screen 【发布时间】:2019-07-13 17:29:13 【问题描述】:

我正在尝试使用 docker 来包含我的应用程序并转发 x11 以使用 chromedriver 生成 Chrome。 我可以让浏览器产生,但它的产生都是空白的。上下文菜单也是空白的。它关闭而不会崩溃。

介绍性信息:(可以跳过)

我有一个应用程序(django+postgresql+supervisor+uwsgi+celery+redis+nginx+selenium)通过带有 Selenium 的 Chromedriver 生成 Chrome/Chromium 浏览器,在不同的预加载用户数据目录中打开它们(预加载会话和登录)并在不同的站点中执行一些自动化操作。

在我的电脑上一切正常。

一些同事要求我为他们安装我的应用程序。我告诉他们它只能在 Linux 上运行,因为我在 Linux 中开发,我不确定在 Windows 中是否一切都一样。

在他们中的一个人安装了 Ubuntu 之后,我尝试使用我的源代码安装所有东西,使用我的私人 git 存储库进行共享/更新,这非常痛苦。

首先,我在安装正确的 Python 版本时遇到了麻烦,之后,主管没有按我预期的那样工作。每一步都有不同的麻烦,应用程序本身也会出现一些我自己的环境中没有的错误。

问题本身:(可以从这里开始阅读)

所以,经过大量阅读,我认为 Docker 非常适合,即使它不是为打开桌面应用程序而设计的。一个 X11 前锋就可以解决这个问题。

我直接使用 Docker-compose 文件(以加快并行进程设置)。这其实是我第一次使用 docker,感觉很简单。 我制作了一个 Dockerfile 和一个 docker-compose 文件来设置所有内容(正确的 python 版本、chrome/chromedrivers 及其依赖项),并且所有内容(除了 Chrome)都很好用。

在使用 X11 重定向进行一些挖掘和测试后,我可以让我的应用程序启动 Chrome 并在我的主机中生成 Chrome 窗口,但窗口本身是空白的。即使右键单击,打开的上下文菜单也是空白的。

我在主机上运行了xhost +local:root,但这并不能解决问题。

我在第 3 部分中阅读了 http://wiki.ros.org/docker/Tutorials/GUI。孤立的方式,我应该做这样的事情

```XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth
touch $XAUTH
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -

docker run -it \
        --volume=$XSOCK:$XSOCK:rw \
        --volume=$XAUTH:$XAUTH:rw \
        --env="XAUTHORITY=$XAUTH" \
        --env="DISPLAY" \
        -user="myNewUserName" \
    osrf/ros:indigo-desktop-full \
    rqt```

但我不确定我应该如何在 docker-compose 文件中执行 xauth 列表内容(或者我应该在哪里?)。我实际上不是 100% 确定我的问题在 xauth 内部。

这是我的 docker 文件: 我选择 Python 3.7.4-slim-strech 因为它: * 为我提供正确的 python 版本 * Debian 可以从其存储库安装 chromium 和 chromedriver(chromium 版本 73) * 它是我为我的需要找到的最简单的设置


FROM python:3.7.4-slim-stretch

RUN apt-get update && apt-get install -y chromium chromedriver build-essential

ENV PYTHONUNBUFFERED 1

# My Actual System Username, i've also tested with other username and i have the same issue
ENV USERNAME "gabriel"

# These UID and GID match mines
RUN export uid=1000 gid=1000 && \
    addgroup \
     --system \
     --gid $gid \
       $USERNAME && \
    adduser \
     --system \
     --uid $uid \
     --shell /bin/bash \
     --gid $gid \
       $USERNAME && \
    usermod -aG sudo $USERNAME && \
    passwd -d $USERNAME

RUN mkdir /app && \
    mkdir /config && \
    mkdir -p /var/www/static

ADD ./config /config
RUN pip install -r /config/requirements.pip

RUN chown -R $uid:$gid /app && \
    chown -R $uid:$gid /config && \
    chown -R $uid:$gid /var/www && \
    chmod +x /config/application_launch.sh

USER $USERNAME
ENV HOME /home/$USERNAME

WORKDIR /app

ADD ./src /app

这是我的 docker compose 文件:


services:
  db:
    image: postgres
    container_name: ps01

  supervisor:
    build: .
    command: supervisord -c /config/supervisord.conf
    volumes:
      - ./src:/app
      - ./src/static:/var/www/static
      - /tmp/.X11-unix:/tmp/.X11-unix:rw
    ports:
      - "9001:9001"
    expose:
      - "8000"
    depends_on:
      - db
    extra_hosts:
      - "yangoo.network:10.68.0.1"
    container_name: su01
    environment:
      - DISPLAY
      - UID
      - QT_X11_NO-MITSHM=1

  nginx:
    image: nginx
    container_name: wb01
    ports:
      - "80:80"
    volumes:
      - ./src:/app
      - ./config/nginx:/etc/nginx/conf.d
      - ./src/static:/var/www/static
    depends_on:
      - supervisor
    links:
      - supervisor

编辑

将我的发行版升级到 popos 19.04 修复了黑屏问题。我也可以让它在具有较新的 linux 发行版的虚拟机中工作。该问题似乎只存在于较旧的发行版中。

【问题讨论】:

您是否考虑过为此应用程序使用虚拟机?这具有能够运行“本机”显示驱动程序的优势。 (如果您尝试使用此设置支持基于 Windows 的同事,他们可能没有运行 X 服务器,并且此技巧可能不起作用。) 我做到了。我用薄荷 linux 做了一个。但是文件太大了,用 docker + git 推送更新真的很方便。我最后的想法是结合用于 windows 主机的 vm + dockerized 项目和仅用于 linux envs 的 dockerized 项目 【参考方案1】:

有一个 Chromium 错误:https://bugs.chromium.org/p/chromium/issues/detail?id=1048186

根据 cmets,在 docker-compose 中将 ipc: host 添加到您的主管配置中将起作用:

supervisor:
    build: .
    command: supervisord -c /config/supervisord.conf
    volumes:
      - ./src:/app
      - ./src/static:/var/www/static
      - /tmp/.X11-unix:/tmp/.X11-unix:rw
    ports:
      - "9001:9001"
    expose:
      - "8000"
    depends_on:
      - db
    extra_hosts:
      - "yangoo.network:10.68.0.1"
    container_name: su01
    environment:
      - DISPLAY
      - UID
      - QT_X11_NO-MITSHM=1
    ipc: host

【讨论】:

以上是关于Docker X11 Forward 得到黑屏的主要内容,如果未能解决你的问题,请参考以下文章

使用 X11 在 docker 内运行 GUI 应用程序不起作用

X11 显示变量未设置 - 无法运行 Docker Image

“通道 0 上的 X11 转发请求失败”

Docker 中的 Java GUI Maven 项目出现 X11 错误

当图像在 docker 机器中运行时,X11 转发不起作用,但如果图像在没有 docker 机器的情况下运行,则它可以正常工作

Pycharm,Docker和GUI