如何根据主机名在Dockerfile中设置ENV var?我试过这个:
RUN if [ hostname = "foo" ]; then ENV BAR "BAZ"; else ENV BAR "BIFF"; fi
但是
失败了ENV: not found
答案 0 :(得分:3)
如果[hostname =“foo”]则运行;那么ENV BAR“BAZ”;否则ENV BAR“BIFF”;网络
你不能嵌套docker构建指令,在RUN
指令在图像上下文中执行之后的所有内容,docker build命令都没有
存在于那里。这样就解释了你所看到的错误。
即使您将其转换为正确的shell代码,BAR
也只会在构建期间对该单 RUN
指令有效。
在主机上进行编排并通过BAR
将run -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