我尝试使用docker build命令和适当的Dockerfile自动创建开发Docker镜像。我需要在RUN命令中运行的脚本之一希望用户点击并阅读他们的许可协议。因此有两个问题:
docker build
Dockerfile
RUN
ddarikpa1#
你也可以分几步来做,从一个Dockerfile开始,直到交互部分之前。然后docker build -t image1 .现在只要docker run -it --name image2 image1 /bin/bash你有一个shell里面,你可以做你的交互式命令,然后做一些像docker commit image2 myuser/myimage:2.1docker commit的文档https://docs.docker.com/engine/reference/commandline/commit/您可能需要指定新的CMD或ENTRYPOINT,如文档中所述使用新的CMD和EXPOSE指令提交容器例如,一些使用wine的docker镜像通过几个步骤来完成,安装wine,然后启动并配置在wine中启动的软件,然后是docker commit
docker build -t image1 .
docker run -it --name image2 image1 /bin/bash
docker commit image2 myuser/myimage:2.1
docker commit
wztqucjr2#
在构建过程中,RUN命令的输出会显示在你的终端中。Docker构建过程是完全非交互式的,所以你必须找到某种方法来自动接受这些条款(几乎每个软件都允许这样做,比如apt-get install -y...),或者使用一些shell向导将接受回显到过程中或其他什么(Expect?)。
apt-get install -y...
kmynzznz3#
您可以使用here技术:
(echo "initial command" && cat) | some_tool
或者,如果多个阶段使用printf和concat与\n:
printf
\n
(printf "cmd1\ncmd2" && cat) | some_tool
mjqavswn4#
要在生成期间查看所有命令的输出,如果它们没有为您显示足够的详细信息,请尝试:docker build --progress=plain --no-cache -t yourTag .
docker build --progress=plain --no-cache -t yourTag .
2hh7jdfx5#
您可以使用像expect这样的工具来自动化用户交互。1.将expect添加到您的映像中(最好是构建步骤,因为您以后将不需要它)。
expect
RUN apt update && apt install -yq expect
1.创建一个要运行的脚本,类似于:
#!/usr/bin/env expect set timeout 10 spawn some_program_that_requires_interaction.sh expect "Some string that we want to wait for" # send newline, simulating pressing enter: send -- "\r" expect eof
1.将脚本复制到映像中并运行它:
COPY my_expect_script . RUN sh my_expect_script
这是完全未经测试的,很难知道它在您的特定场景中的工作效果如何。Expect在涉及到curses(或任何类型的CLI UI,玩弄光标位置)时工作得不那么好,所以您的里程可能会有所不同。
Expect
5条答案
按热度按时间ddarikpa1#
你也可以分几步来做,从一个Dockerfile开始,直到交互部分之前。然后
docker build -t image1 .
现在只要
docker run -it --name image2 image1 /bin/bash
你有一个shell里面,你可以做你的交互式命令,然后做一些像
docker commit image2 myuser/myimage:2.1
docker commit
的文档https://docs.docker.com/engine/reference/commandline/commit/
您可能需要指定新的CMD或ENTRYPOINT,如文档中所述
使用新的CMD和EXPOSE指令提交容器
例如,一些使用wine的docker镜像通过几个步骤来完成,安装wine,然后启动并配置在wine中启动的软件,然后是
docker commit
wztqucjr2#
在构建过程中,
RUN
命令的输出会显示在你的终端中。Docker构建过程是完全非交互式的,所以你必须找到某种方法来自动接受这些条款(几乎每个软件都允许这样做,比如apt-get install -y...
),或者使用一些shell向导将接受回显到过程中或其他什么(Expect?)。kmynzznz3#
您可以使用here技术:
或者,如果多个阶段使用
printf
和concat与\n
:mjqavswn4#
要在生成期间查看所有命令的输出,如果它们没有为您显示足够的详细信息,请尝试:
docker build --progress=plain --no-cache -t yourTag .
2hh7jdfx5#
您可以使用像
expect
这样的工具来自动化用户交互。1.将
expect
添加到您的映像中(最好是构建步骤,因为您以后将不需要它)。1.创建一个要运行的脚本,类似于:
1.将脚本复制到映像中并运行它:
这是完全未经测试的,很难知道它在您的特定场景中的工作效果如何。
Expect
在涉及到curses(或任何类型的CLI UI,玩弄光标位置)时工作得不那么好,所以您的里程可能会有所不同。