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

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

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

我尝试了一些方法。

ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`

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


当前回答

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

然后创建一个Dockerfile,内容如下:

ENV MY_ENV_VAR $MY_ENV_VAR

我猜某些特殊字符可能会有问题,但至少在大多数情况下这是可行的。

其他回答

添加-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

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

export MYVAR="my_var_outside"
cat > build/env.sh <<EOF
MYVAR=${MYVAR}
EOF

... 然后在Dockerfile中

ADD build /build
RUN /build/test.sh

where test.sh从env.sh加载MYVAR

#!/bin/bash
. /build/env.sh
echo $MYVAR > /tmp/testfile

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

然后创建一个Dockerfile,内容如下:

ENV MY_ENV_VAR $MY_ENV_VAR

我猜某些特殊字符可能会有问题,但至少在大多数情况下这是可行的。

使用envsubst而不失去使用COPY或ADD等命令的能力,并且不使用中间文件的替代方法是使用Bash的Process Substitution:

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

当使用build-arg时…

docker build——build-arg CODE_VERSION=1.2 Dockerfile

...考虑变量在FROM之后不可用:

ARG  CODE_VERSION=latest
FROM base:${CODE_VERSION}

在FROM之前声明的ARG在构建阶段之外,因此它不能在FROM之后的任何指令中使用。

通常arg应该放在FROM之后,如果FROM期间不需要的话:

FROM base:xy
ARG  ABC=123

要使用在第一个FROM之前声明的ARG的默认值,请使用在构建阶段中不带值的ARG指令:

ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version

https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact