根据Dockerfile中的主机名有条件地设置ENV var

时间:2017-04-14 19:01:16

标签: docker dockerfile

如何根据主机名在Dockerfile中设置ENV var?我试过这个:

RUN if [ hostname = "foo" ]; then ENV BAR "BAZ"; else ENV BAR "BIFF"; fi

但是

失败了
ENV: not found

3 个答案:

答案 0 :(得分:3)

  

如果[hostname =“foo”]则运行;那么ENV BAR“BAZ”;否则ENV BAR“BIFF”;网络

你不能嵌套docker构建指令,在RUN指令在图像上下文中执行之后的所有内容,docker build命令都没有 存在于那里。这样就解释了你所看到的错误。

即使您将其转换为正确的shell代码,BAR也只会在构建期间对该 RUN指令有效。

在主机上进行编排并通过BARrun -e传递到您的容器,或者在容器启动时根据需要为BAR添加启动脚本:

FROM foo
COPY my-start.sh /
CMD ["/my-start.sh"]

答案 1 :(得分:2)

首先,你不能将Docker构建命令嵌入到RUN的shell中,shell将在构建过程中在中间容器内运行,而Docker构建命令将由Docker构建引擎运行,它们'不同的事情。此外,Docker不支持像IF这样的条件命令。 Docker是关于不可变的基础架构,Dockerfile是你的图像的定义,它应该能够生成相同的图像,无论它在什么构建上下文。从交付的角度来看,图像是你的可交付构建工件,如果你想提供不同的东西,然后使用不同的Dockerfile来构建不同的图像,否则如果差异与运行时有关,我认为你真的可以考虑将env定义推迟到运行时-e选项docker run

答案 2 :(得分:1)

@shizhz&解释了你的构建失败的原因。 @Erik Dannenberk。

但是,如果你确实需要这种行为,我建议你制作一个小脚本来做到这一点:

export BAR=`[[ hostname = "foo" ]] && echo "BAZ" || echo "BIFF"`

docker build -t hello/hi - <<EOF
FROM alpine
ENV BAR $BAR
CMD echo $BAR
EOF