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

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

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

但那失败了

 ENV: not found 

如果[hostname =“foo”],则运行RUN; 然后ENV BAR“BAZ”; 否则ENV BAR“BIFF”; 科幻

你不能嵌套dockerbuild造指令,在图像上下文中执行RUN指令后,docker build命令在那里不存在。 这就解释了你所看到的错误。

即使你把它翻译成合适的shell代码, BAR也只会在构build过程中对那个单一的 RUN指令有效。

在主机上进行编排并通过run -eBAR传递到您的容器,或者将启动脚本添加到在容器启动时根据需要设置BAR的图像:

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

首先,不能将Docker构build命令embedded到RUN shell中,在构build过程中shell将在中间容器中运行,而Docker构build命令将由Docker构build引擎运行,这两者是不同的。 另外,Docker不支持像IF这样的条件命令。 Docker是关于不可变的基础设施,Dockerfile是图像的定义,它应该能够生成相同的图像,无论它在哪个构build上下文中。而从视图的交付angular度来看,图像是可交付的构build工件,如果你想提交不同的东西,然后使用不同的Dockerfile来构build不同的图像,否则,如果差异是关于运行时间,我认为你可以考虑推迟env定义到运行时用docker run -e选项。

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

但是,如果你真的需要这种行为,我build议你做一个脚本来做到这一点:

 export BAR=`[[ hostname = "foo" ]] && echo "BAZ" || echo "BIFF"` docker build -t hello/hi - <<EOF FROM alpine ENV BAR $BAR CMD echo $BAR EOF