获取Dockerfile中的环境变量值

时间:2013-10-23 09:16:03

标签: docker

我正在为ruby应用程序构建容器。我的应用程序配置包含在环境变量中(使用dotenv加载到应用程序内部。)

其中一个配置变量是app的公共ip,它在内部用于建立链接。 我需要添加一个dnsmasq条目,将此ip指向容器内的127.0.0.1,这样它就可以获取应用程序的链接,就像它没有集装箱化一样。

因此我试图在我的Dockerfile中设置一个ENV,它将环境变量传递给容器。

我尝试了一些事情。

ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`

但是,所有内容都会传递“REQUEST_DOMAIN”字符串,而不是环境变量的值。 有没有办法将环境变量值从主机传递到容器?

6 个答案:

答案 0 :(得分:331)

您应该在Dockerfile中使用ARG directive来实现此目的。

  

ARG指令定义了一个变量,用户可以使用--build-arg <varname>=<value>标志使用docker build命令在构建时将其传递给构建器。

所以你的 Dockerfile 将有这一行:

ARG request_domain

或者您更喜欢默认值:

ARG request_domain=127.0.0.1

现在您可以在Dockerfile中引用此变量:

ENV request_domain=$request_domain

然后你将像这样建立你的容器:

$ docker build --build-arg request_domain=mydomain Dockerfile


注1:如果您在Dockerfile中引用ARG但在--build-arg中将其排除,则无法构建您的图片。

注意2:如果用户指定了未在Dockerfile中定义的构建参数,则构建会输出警告:

  

[警告]未使用一个或多个build-args [foo]。

答案 1 :(得分:52)

所以你可以这样做: cat Dockerfile | envsubst | docker build -t my-target -

然后有一个类似于:

的Dockerfile
ENV MY_ENV_VAR $MY_ENV_VAR

我想某些特殊字符可能存在问题,但这至少适用于大多数情况。

答案 2 :(得分:17)

使用envsubst而不会失去使用COPYADD等命令的替代方法,而不使用中间文件的替代方法是使用Bash的Process Substitution

docker build -f <(envsubst < Dockerfile) -t my-target .

注意:最初想在jonasfj's answer添加评论,但似乎我没有足够的声誉。

答案 3 :(得分:9)

从您在运行时创建的文件中加载环境变量。

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

答案 4 :(得分:2)

如果您只想在Dockerfile中查找并​​替换所有环境变量($ ExampleEnvVar),那么构建它可以工作:

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1

答案 5 :(得分:-5)

添加-e键,用于将环境变量传递给容器。 例如:

$ 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