Dockerfile中的交互式命令

Dockerfile中的交互式命令,docker,dockerfile,Docker,Dockerfile,我正在尝试使用Docker build命令和适当的Dockerfile自动创建开发Docker映像。我需要在run命令中运行的一个脚本希望用户点击并阅读他们的许可协议。因此,有两个问题: 其中是Dockerfile中所有RUN命令的输出 什么解决方案可以与上述命令交互?现在,docker build命令在无限循环中向用户请求输入时卡住了 生成期间,RUN命令的输出显示在终端中。Docker构建过程是完全非交互式的,因此您必须找到某种方式来自动接受条款(几乎每一个软件都允许这样做,想想apt ge

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

  • 其中是
    Dockerfile
    中所有
    RUN
    命令的输出
  • 什么解决方案可以与上述命令交互?现在,
    docker build
    命令在无限循环中向用户请求输入时卡住了

  • 生成期间,
    RUN
    命令的输出显示在终端中。Docker构建过程是完全非交互式的,因此您必须找到某种方式来自动接受条款(几乎每一个软件都允许这样做,想想
    apt get install-y…
    ),或者使用一些shell向导将接受回复到过程或其他任何东西(可能?)。

    您也可以通过几个步骤来完成,从带有说明的Dockerfile开始,直到交互部分之前。然后

    docker build-t image1.

    现在

    docker run-it--name image2 image1/bin/bash

    你有一个外壳在里面,你可以做你的交互命令,然后做类似的事情

    docker提交image2 myuser/myimage:2.1

    docker提交的文档

    您可能需要指定新的CMD或ENTRYPOINT,如文档中所述

    使用新CMD提交容器并公开指令

    例如,一些使用wine的docker映像分几个步骤进行操作,安装wine,然后启动并配置wine中启动的软件,然后
    docker提交

    您可以使用以下技术:

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

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

    是的,对于
    apt get
    类型的应用程序,我确实使用了
    -y
    。但这是一些商业的东西。是的,商业的东西通常都很糟糕;)但如果他们没有非交互模式,我会感到惊讶:)如果没有,那么看看Expect。我也有类似的问题。在构建映像时,我正在docker中安装conda(基于arm的映像目前不可用)。代码看起来像运行bash Anaconda3-2021.04-Linux-aarch64.sh,这就是问题所在,因为它需要输入多次yes。任何关于如何处理的建议。是否有关于如何在dockerfile中使用expect的链接?正如johnharris85所说,使用ExpectCome在这里寻找关于如何在正在进行的dockerfile
    中交互重新运行命令的答案(echo“Password”和&cat)| sudo ls
    不起作用,我把sudo作为交互工具的一个常见示例。@Atomosk许多基于控制台的程序,如
    sudo
    不从stdin读取密码等敏感数据,而是更直接地从终端读取。您可以使用
    -S
    使
    sudo
    从stdin中读取。@creativecoding我知道关于-S的内容,这就是为什么我说
    sudo
    只是一个常见的例子。每个人都可以测试并看到
    echo
    对您没有帮助。
    (printf "cmd1\ncmd2" && cat) | some_tool