Dockerfile中的条件ENV
是否有可能根据构buildARG
的值有条件地设置一个Dockerfile中的ENV
variables?
例如:像
ARG BUILDVAR=sad ENV SOMEVAR=if $BUILDVAR -eq "SO"; then echo "hello"; else echo "world"; fi
更新:基于Mario回答的当前使用情况:
ARG BUILD_ENV=prod ENV NODE_ENV=production RUN if [ "${BUILD_ENV}" = "test" ]; then export NODE_ENV=development; fi
但是,使用--build-arg BUILD_ENV=test
,然后进入主机,我仍然得到
docker run -it mycontainer bin/bash [root@brbqw1231 /]# echo $NODE_ENV production
您不能直接在Dokerfile中运行bash代码,但是您必须使用RUN命令。 因此,例如,你可以改变ENV与RUN结束导出variables在if,如下所示:
ARG BUILDVAR=sad RUN if $BUILDVAR -eq "SO"; then export SOMEVAR=hello; else export SOMEVAR=world; fi
我没有尝试,但应该工作。
虽然您不能设置有条件的ENV
variables,但您可能能够使用RUN
命令和空合并环境variables来实现您的目标:
RUN node /var/app/current/index.js --env ${BUILD_ENV:-${NODE_ENV:-"development"}}
你的逻辑其实是正确的。 这里的问题是RUN export ...
将无法在Dockerfile中工作,因为export
命令不会持续存在于所有映像中。 Dockerfiles创build一个临时容器为了生成它的图像,所以环境variables将不存在。
ENV
另一方面根据文档状态:
使用
ENV
设置的环境variables将在从结果图像运行容器时持久化。
要做到这一点的唯一方法是在您的图像生成容器时,你的docker run
命令,并围绕你的逻辑:
if [ "${BUILD_ENV}" = "test" ]; then docker run -e NODE_ENV=development myimage else docker run myimage fi
将值传递给Dockerfile,然后传递给入口点脚本
从命令行传递你所需的值(TARG)
docker run --env TARG=T1_WS01 -i projects/msbob
然后在你的Dockerfile
放入这样的东西
Dockerfile: # if $TARG is not set then "entrypoint" defaults to Q0_WS01 CMD ./entrypoint.sh ${TARG} Q0_WS01
entrypoint.sh
脚本只读取第一个参数
entrypoint.sh: #!/bin/bash [ $1 ] || { echo "usage: entrypoint.sh <$TARG>" ; exit ; } target_env=$1