如何在Dockerfile中硬编码用户输入或以交互模式执行docker build?
解决方案
你可以根据是否需要自动化构建,选择以下两种方案:
方案1:硬编码输入值(更推荐,适配自动化构建)
这种方案可以让镜像构建全程无交互,构建产物可复现,适配CI/CD场景。
如果你的安装脚本是按行依次接收输入(先输入安装路径回车,再输入时区整数回车),直接用printf按顺序传递输入即可,修改Dockerfile中最后一行的RUN指令:
# 假设你要设置安装路径为/opt/mytool,时区对应整数为8,按实际需求替换这两个值即可 RUN printf "/opt/mytool\n8\n" | ./toolPackageInstaller
如果安装脚本的交互逻辑更复杂(比如需要匹配提示关键词再输入),可以安装expect工具编写交互脚本实现硬编码,修改后的完整Dockerfile示例如下:
FROM ubuntu:bionic WORKDIR /tmp RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \ build-essential \ sudo \ git \ make \ expect # 新增expect依赖 COPY ToolPackage.tar.xz /tmp RUN tar xvfJp /tmp/ToolPackage.tar.xz WORKDIR /tmp/ToolPackage RUN chmod +x toolPackageInstaller # 编写expect脚本处理交互 RUN expect -c ' spawn ./toolPackageInstaller expect "请输入安装路径:" { send "/opt/mytool\r" } expect "请输入时区对应整数:" { send "8\r" } expect eof '
注意:上面expect脚本里的提示字符串需要和你安装脚本实际输出的提示内容完全匹配,可先手动运行一次安装脚本确认提示文本。
方案2:开启docker build交互模式,手动输入
如果需要每次构建时动态指定值,可以给docker build命令添加-i(开启交互模式)和--progress=plain(输出纯文本日志,不隐藏交互提示)参数:
docker build -f Dockerfile -t ubuntu:mytool -i --progress=plain .
构建运行到安装步骤时,会自动暂停等待你输入对应内容即可。该方案的缺点是无法实现自动化构建,每次构建都需要人工值守操作。
内容的提问来源于stack exchange,提问作者sa_penguin
相关产品推荐
相关产品推荐

