Dockerfile中的交互式命令

ftf50wuq  于 2023-04-20  发布在  Docker
关注(0)|答案(5)|浏览(314)

我尝试使用docker build命令和适当的Dockerfile自动创建开发Docker镜像。我需要在RUN命令中运行的脚本之一希望用户点击并阅读他们的许可协议。因此有两个问题:

  1. Dockerfile中所有RUN命令的输出在哪里?
    1.什么解决方案可以与上述命令交互?现在docker build命令只是在无限循环中要求用户输入。
ddarikpa

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

wztqucjr

wztqucjr2#

在构建过程中,RUN命令的输出会显示在你的终端中。Docker构建过程是完全非交互式的,所以你必须找到某种方法来自动接受这些条款(几乎每个软件都允许这样做,比如apt-get install -y...),或者使用一些shell向导将接受回显到过程中或其他什么(Expect?)。

kmynzznz

kmynzznz3#

您可以使用here技术:

(echo "initial command" && cat) | some_tool

或者,如果多个阶段使用printf和concat与\n

(printf "cmd1\ncmd2" && cat) | some_tool
mjqavswn

mjqavswn4#

要在生成期间查看所有命令的输出,如果它们没有为您显示足够的详细信息,请尝试:
docker build --progress=plain --no-cache -t yourTag .

2hh7jdfx

2hh7jdfx5#

您可以使用像expect这样的工具来自动化用户交互。
1.将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,玩弄光标位置)时工作得不那么好,所以您的里程可能会有所不同。

相关问题