图像构建期间的X11交互

时间:2017-04-22 18:23:41

标签: docker

我正在尝试为构建期间需要用户交互的图像创建Dockerfile。我知道这非常难看,但是没有简单的方法,因为它涉及使用专有安装程序安装传统软件。

一旦构建,容器将使用xpra通过Web套接字公开X11应用程序。

目前我通过创建卷并在第一次运行容器时进行安装来实现它。这会产生一些维护问题,因为我希望将预先构建的映像发送到注册表。

我愿意牺牲容器构建自动化的可能性,因为它很少重建,但经常部署。

我考虑过的事情:

  • 在构建期间运行xpra。然后我如何公开端口以便我可以访问Web界面?
  • 在构建期间导出$DISPLAY。如何在构建期间隧道传输X11流量?
  • 运行Xvfb并尝试使用例如自动化xaut。这将是长期目标,但并非易事。我现在希望快速入侵。

我意识到这是一种与Docker相反的反模式,但也是一个Docker真正闪耀的用例:导出一个遗留应用程序,这是一个噩梦,以易于使用的格式设置,可以从浏览器运行

1 个答案:

答案 0 :(得分:1)

我知道这个问题是在不久前提出的,但是最近我遇到了同样的问题。由于没有答案发布,因此我将添加我的答案。我通过实施下面概述的多步骤构建过程来“解决”此问题。

  1. 创建一个dockerfile来构建基础映像,该基础映像安装了运行安装程序所需的工具和依赖项。例如:

    # Dockerfile
    FROM centos:6.10
    RUN yum -y install curl glibc.i686 libX11.i686 xorg-x11-utils zlib.i686 libstdc++.i686 \
     && yum clean all
    
  2. 从dockerfile和grep构建映像以获取IMAGE ID。 注意:构建时我故意不命名/标记该图像。由于尚无法对图像进行“取消标记”,因此中间图像名称:tag将始终使“ $ docker images”的输出混乱。

    $ docker build . | grep Successfully | cut -d' ' -f3
    
  3. 运行基本映像并在容器中执行安装程序。另外,命名容器以便以后使用。 注意:因为我通过ssh访问我的docker主机,所以我使用以下运行命令通过ssh隧道X11:

    $ docker run --name <container_name> --env="DISPLAY" \
    --volume="$HOME/.Xauthority:/root/.Xauthority:rw" --net=host \
    <IMAGE ID> bash -c "<your commands to curl the installer and execute it>"
    

但是,如果您在本地运行docker,请改用以下命令:

    $ docker run --name <container_name> --env="DISPLAY" \
    --volume="/tmp/.X11-unix:/tmp/.X11-unix" \
    <IMAGE ID> bash -c "<your commands to curl the installer and execute it>"
  1. 根据容器的更改创建新图像。

    $ docker commit <container_name> <final-image-name>:<tag>
    $ docker rm <container_name>
    
  2. 检查是否已创建新图像标签

    $ docker images | grep <final-image-name>
    
  3. 运行新图像。

    $ docker run -it --rm <final-image-name>:<tag> bash
    
  4. (可选)将映像推送到docker注册表:dockerhub,artifactory等。

    $ docker login <server>
    $ docker push <final-image-name>:<tag>