Dockerfile中的条件逻辑,使用--build arg

Dockerfile中的条件逻辑,使用--build arg,docker,dockerfile,docker-build,Docker,Dockerfile,Docker Build,假设我有这个: 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" docker build -t zoom \ --build-arg my_user=

假设我有这个:

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"
docker build -t zoom \
    --build-arg my_user="foo"  \
    --build-arg my_home="/home/foo"  \
     .
显然,这是错误的语法

我能想到的唯一解决方案是只使用两个--build args,如下所示:

ENV HOME $my_user === "root"? "/root" : "/home/$my_user"
docker build -t zoom \
    --build-arg my_user="foo"  \
    --build-arg my_home="/home/foo"  \
     .

不幸的是,你不能直接这样做

所以你有两个选择

在开始时使用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:除了
运行echo“export NAME=TARUN”>/etc/profile.d/myenv.sh
之外,您还可以执行
复制myevn.sh/etc/profile.d/myenv.sh
并将该文件显示在构建上下文中


我不确定导出是否在这样的子shell中工作。我认为它将只与
ENV
命令一起工作,或者可能与bash-c“export X=Y”一起工作,如果概要文件是在环境中生成的,那么一旦导出了环境,处理过的任何子级或exec都将继承相同的概要文件。以上都是经过测试的,然后只有postedok谢谢我现在相信你了。虽然我不相信点击了向上投票的问题按钮。