我正在尝试为构建期间需要用户交互的图像创建Dockerfile。我知道这非常难看,但是没有简单的方法,因为它涉及使用专有安装程序安装传统软件。
一旦构建,容器将使用xpra
通过Web套接字公开X11应用程序。
目前我通过创建卷并在第一次运行容器时进行安装来实现它。这会产生一些维护问题,因为我希望将预先构建的映像发送到注册表。
我愿意牺牲容器构建自动化的可能性,因为它很少重建,但经常部署。
我考虑过的事情:
xpra
。然后我如何公开端口以便我可以访问Web界面?$DISPLAY
。如何在构建期间隧道传输X11流量?我意识到这是一种与Docker相反的反模式,但也是一个Docker真正闪耀的用例:导出一个遗留应用程序,这是一个噩梦,以易于使用的格式设置,可以从浏览器运行
答案 0 :(得分: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
从dockerfile和grep构建映像以获取IMAGE ID。 注意:构建时我故意不命名/标记该图像。由于尚无法对图像进行“取消标记”,因此中间图像名称:tag将始终使“ $ docker images”的输出混乱。
$ docker build . | grep Successfully | cut -d' ' -f3
运行基本映像并在容器中执行安装程序。另外,命名容器以便以后使用。 注意:因为我通过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>"
根据容器的更改创建新图像。
$ docker commit <container_name> <final-image-name>:<tag>
$ docker rm <container_name>
检查是否已创建新图像标签
$ docker images | grep <final-image-name>
运行新图像。
$ docker run -it --rm <final-image-name>:<tag> bash
(可选)将映像推送到docker注册表:dockerhub,artifactory等。
$ docker login <server>
$ docker push <final-image-name>:<tag>