在Dockerfile中获取环境variables值
我正在构build一个Ruby应用程序的容器。 我的应用程序的configuration包含在环境variables中(使用dotenv在应用程序中加载 )。
其中一个configurationvariables是应用程序的公共IP,在内部用于build立链接。 我需要添加一个dnsmasq条目,将这个ip指向容器内部的127.0.0.1,所以它可以获取应用程序的链接,就好像它没有被容器化。
因此,我试图在我的Dockerfile中设置一个将环境variables传递给容器的ENV
。
我尝试了一些东西。
ENV REQUEST_DOMAIN $REQUEST_DOMAIN ENV REQUEST_DOMAIN `REQUEST_DOMAIN`
尽pipe如此,一切都会传递“REQUEST_DOMAIN”string而不是环境variables的值。 有没有办法将环境variables值从主机传递给容器?
你应该在你的Dockerfile中使用ARG
指令来实现这个目的。
ARG
指令使用--build-arg <varname>=<value>
标志定义了一个用户可以在构build时通过docker build命令向构build器传递的variables。
所以你的Dockerfile将有这样的一行:
ARG request_domain
或者如果你更喜欢默认值:
ARG request_domain=127.0.0.1
现在你可以在你的Dockerfile中引用这个variables:
ENV request_domain=$request_domain
那么你会像这样build立你的容器:
$ docker build --build-arg request_domain=mydomain Dockerfile
注意:如果您在Dockerfile中引用了ARG
,但在--build-arg
中将其排除,则不会生成映像。
所以你可以这样做: cat Dockerfile | envsubst | docker build -t my-target -
cat Dockerfile | envsubst | docker build -t my-target -
然后有一个像这样的Dockerfile:
ENV MY_ENV_VAR $MY_ENV_VAR
我想可能有一些特殊字符有问题,但是这对大多数情况至less起作用。
从运行时创build的文件加载环境variables。
export MYVAR="my_var_outside" cat > build/env.sh <<EOF MYVAR=${MYVAR} EOF
然后在Dockerfile中
ADD build /build RUN /build/test.sh
test.sh从env.sh加载MYVAR
#!/bin/bash . /build/env.sh echo $MYVAR > /tmp/testfile
另一种使用envsubst
而不失去使用像COPY
或ADD
这样的命令而不使用中间文件的function的方法是使用Bash的进程replace :
docker build -f <(envsubst < Dockerfile) -t my-target .
注:本来想给jonasfj的回答添加评论,但似乎我没有足够的声誉。
如果你只是想find并replaceDockerfile中的所有环境variables($ ExampleEnvVar),然后构build它,这将工作:
envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -
添加-e
键将环境variables传递给容器。 例:
$ MYSQLHOSTIP=$(sudo docker inspect -format="{{ .NetworkSettings.IPAddress }}" $MYSQL_CONRAINER_ID) $ sudo docker run -e DBIP=$MYSQLHOSTIP -i -t myimage /bin/bash root@87f235949a13:/# echo $DBIP 172.17.0.2