在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而不失去使用像COPYADD这样的命令而不使用中间文件的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