首页 > 解决方案 > 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"  \
     .

标签: dockerdockerfiledocker-build

解决方案


不幸的是,您不能直接执行此操作

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并让文件出现在您的构建上下文中


推荐阅读