docker - Dockerfile 中的条件逻辑,使用 --build-arg
问题描述
说我有这个:
ARG my_user="root" # my_user => default is "root"
USER $my_user
ENV USER=$my_user
到目前为止一切都很好,但现在我们到了这里:
ENV HOME="/root"
有没有办法做这样的事情:
ENV HOME $my_user === "root"? "/root" : "/home/$my_user"
显然,这是错误的语法。
我能想到的唯一解决方案是只使用两个 --build-args,如下所示:
docker build -t zoom \
--build-arg my_user="foo" \
--build-arg my_home="/home/foo" \
.
解决方案
不幸的是,您不能直接执行此操作
https://forums.docker.com/t/how-do-i-send-runs-output-to-env-in-dockerfile/16106/3
所以你有两种选择
在开始时使用 shell 脚本
您可以在开始时使用 shell 脚本
CMD /start.sh
在你的start.sh
你可以有这个逻辑
if [ $X == "Y" ]; then
export X=Y
else
export X=Z
fi
创建配置文件环境变量
FROM alpine
RUN echo "export NAME=TARUN" > /etc/profile.d/myenv.sh
SHELL ["/bin/sh", "-lc"]
CMD env
然后当你运行它时
$ docker run test
HOSTNAME=d98d44fa1dc9
SHLVL=1
HOME=/root
PAGER=less
PS1=\h:\w\$
NAME=TARUN
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
CHARSET=UTF-8
注意:
SHELL ["/bin/sh", "-lc"]
这里非常重要,否则配置文件将不会加载注意2:
RUN echo "export NAME=TARUN" > /etc/profile.d/myenv.sh
您也可以执行 aCOPY myevn.sh /etc/profile.d/myenv.sh
并让文件出现在您的构建上下文中
推荐阅读
- python - Pyttsx3 runAndWait() 方法卡住
- c# - 如何从后台线程访问 IServiceCollection
- php - 语法错误或访问冲突:1064 - PDO 拒绝执行多个查询(包括 CREATE TEMPORARY TABLE)
- visual-studio-code - 如何在 VSCode 扩展中添加这些代码完成功能?
- webpack - Webpack、Babel 7.4.0 和 core-js 3
- aws-pinpoint - 是否可以通过 REST API 创建 Amazon Pinpoint 获利事件?
- javascript - Date.getDate() 函数是如何工作的?
- c# - 如何在 ilNumerics 中使用 ZXYPositions 正确绘制 3D 表面?
- r - 如何调用R6父类中的函数,其中父函数依赖于其他重写的辅助函数
- python - 如何将 HTML 表中的数据抓取到 Python 列表/字典中?