Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 映像构建期间的X11交互_Docker - Fatal编程技术网

Docker 映像构建期间的X11交互

Docker 映像构建期间的X11交互,docker,Docker,我正在尝试为需要用户在构建过程中进行交互的映像创建Dockerfile。我知道这非常难看,但没有简单的方法可以解决,因为它涉及到使用专有安装程序安装遗留软件 构建后,容器将使用xpra通过web套接字公开X11应用程序 目前,我通过创建一个卷并在第一次运行容器时进行安装来实现它。不过,这会造成一点维护问题,因为我想将预构建的映像发送到注册表 我愿意牺牲容器构建自动化的可能性,因为它很少重建,但经常部署 我考虑过的事情: 在构建期间运行xpra。然后如何公开端口以便访问web界面 在生成期间导出

我正在尝试为需要用户在构建过程中进行交互的映像创建Dockerfile。我知道这非常难看,但没有简单的方法可以解决,因为它涉及到使用专有安装程序安装遗留软件

构建后,容器将使用
xpra
通过web套接字公开X11应用程序

目前,我通过创建一个卷并在第一次运行容器时进行安装来实现它。不过,这会造成一点维护问题,因为我想将预构建的映像发送到注册表

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

我考虑过的事情:

  • 在构建期间运行
    xpra
    。然后如何公开端口以便访问web界面
  • 在生成期间导出
    $DISPLAY
    。如何在构建期间通过隧道传输X11流量
  • 运行Xvfb并尝试使用xaut等工具实现自动化。这将是一个长期目标,但绝非易事。我希望现在能快速破解

我意识到这是Docker的一种反模式,但也是Docker真正发挥作用的一个用例:导出一个旧的应用程序,这是一个噩梦,需要以易于使用的格式从浏览器运行。

我知道这个问题不久前就被问到了,但我最近遇到了同样的问题。既然没有回复,我就加上我的。我通过实现下面概述的多步骤构建过程来“解决”这个问题

  • 创建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
    
  • 从dockerfile和grep中生成映像ID。 注意:我有意不在构建时命名/标记此图像。由于还没有办法“取消标记”图像,中间图像名称:tag总是会使“$docker images”的输出混乱不堪

  • 运行基本映像并在容器中执行安装程序。另外,请为容器命名,以便于以后使用。 注意:因为我通过ssh访问docker主机,所以我使用以下run命令通过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 run--name--env=“DISPLAY”\
    --volume=“$HOME/.Xauthority:/root/.Xauthority:rw”--net=host\
    bash-c“”
    
  • 但如果您在本地运行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>"
    
    $docker run--name--env=“DISPLAY”\
    --volume=“/tmp/.X11 unix:/tmp/.X11 unix”\
    bash-c“”
    
  • 根据容器的更改创建新图像

    $ docker commit <container_name> <final-image-name>:<tag>
    $ docker rm <container_name>
    
    $docker提交:
    $docker rm
    
  • 检查是否已创建新的图像标记

    $ docker images | grep <final-image-name>
    
    $docker images|grep
    
  • 运行您的新映像

    $ docker run -it --rm <final-image-name>:<tag> bash
    
    $docker run-it--rm:bash
    
  • 或者,将图像推送到docker注册表:dockerhub、artifactory等

    $ docker login <server>
    $ docker push <final-image-name>:<tag>
    
    $docker登录
    $docker推送:
    

  • 阅读您也可以使用或XvfbTo澄清:我知道如何运行GUI应用程序。我需要的是在构建时与GUI交互
    $ docker login <server>
    $ docker push <final-image-name>:<tag>