我正在为一个ruby应用程序构建一个容器。我的应用程序的配置包含在环境变量中(通过dotenv加载到应用程序中)。
其中一个配置变量是应用程序的public ip,它在内部用于创建链接。我需要在容器中添加一个dnsmasq条目,将此ip指向127.0.0.1,这样它就可以像没有容器化一样获取应用程序的链接。
因此,我尝试在我的Dockerfile中设置一个ENV
,它将向容器传递一个环境变量。
我试过几种方法。
ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`
所有东西都传递“REQUEST_DOMAIN”字符串而不是环境变量的值。有没有一种方法可以将环境变量的值从主机传递到容器?
9条答案
按热度按时间tmb3ates1#
您应该在Dockerfile中使用
ARG
指令,这是用于此目的的。ARG
指令定义了一个变量,用户可以在构建时使用--build-arg <varname>=<value>
标志通过docker build命令将其传递给构建器。所以你的 Dockerfile 会有这一行:
或者如果您更喜欢默认值:
现在你可以在你的Dockerfile中引用这个变量:
然后你会像这样构建你的容器:
**注1:**如果您在Dockerfile中引用了
ARG
,但在--build-arg
中将其排除,则您的镜像将不会构建。**注2:**如果用户指定的build参数没有在Dockerfile中定义,则build会输出警告:
[警告]一个或多个build-args [foo]未使用。
jogvjijk2#
因此,您可以:
cat Dockerfile | envsubst | docker build -t my-target -
然后有一个Dockerfile,类似于:
我猜可能有一些特殊字符的问题,但这至少对大多数情况都有效。
ddhy6vgd3#
这是为那些希望在构建过程中使用
.env
文件将env变量从docker-compose传递到dockerfile,然后将这些参数作为env变量传递到容器的人准备的。典型的docker-compose文件将
.env
文件中的env变量传递给build命令中的args。典型的.env
文件现在,当你运行docker-compose up -d命令时,docker-compose文件从.env文件中获取值,然后将其传递给docker-compose文件。现在Web的Dockerfile包含所有在构建过程中通过args的变量。现在典型的Web的dockerfile,
现在我们在dokcerfile中接收到secret_key和db url作为arg。现在让我们将
ENV
中的那些作为ENV SECRET_KEY ${SECRET_KEY?secretkeynotset}
使用。现在即使是docker容器也在其环境中拥有这些变量。* 记住不要使用ARG $SECRET_KEY
(我这样做了)。它应该是ARG SECRET_KEY
*olmpazwi4#
使用
envsubst
而不失去使用COPY
或ADD
等命令的能力,并且不使用中间文件的替代方案是使用Bash的Process Substitution:t9eec4r05#
从运行时创建的文件加载环境变量。
然后在Dockerfile中
其中test.sh从www.example.com加载MYVARenv.sh
dfddblmv6#
如果你只是想找到并替换Dockerfile中的所有环境变量($ExampleEnvVar),那么构建它就可以了:
envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -
2ekbmq327#
使用
build-arg
时...docker build --build-arg CODE_VERSION=1.2 Dockerfile
...假设变量在
FROM
之后不可用:在
FROM
之前声明的ARG
在构建阶段之外,因此不能在FROM
之后的任何指令中使用。通常,如果在
FROM
期间不需要,则ARG
s应放置在FROM
之后:要使用在第一个
FROM
之前声明的ARG
的默认值,请在构建阶段使用不带值的ARG
指令:https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact
ymdaylpp8#
你可以在容器启动时直接传递env变量:
示例:
输出为:
目标变量已添加到当前容器的env变量中!
yvt65v4c9#
添加
-e
键,用于将环境变量传递到容器。例如: