代码之家  ›  专栏  ›  技术社区  ›  Alexander Mills

dockerfile中的条件逻辑,使用--build参数

  •  1
  • Alexander Mills  · 技术社区  · 6 年前

    假设我有这个:

    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"  \
         .
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Tarun Lalwani    6 年前

    不幸的是你不能直接这么做

    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 你也可以做一个 COPY myevn.sh /etc/profile.d/myenv.sh 并让文件出现在您的构建上下文中

    推荐文章