RUN 在 Dockerfile 中表现得很奇怪

问题描述 投票:0回答:1

这是我的 dockerfile 中的片段

SHELL ["/bin/bash", "-c"]
RUN mkdir -p /tmp/env/ 
COPY var.env /tmp/env/
RUN . /tmp/env/var.env

即我想将环境变量从文件注入到 docker 容器 但这样做不会加载环境变量。容器启动后,如果我

exec
进入容器并再次执行
source /tmp/env/var.env
,则会加载环境变量,我可以使用
echo $env_name
看到它。 有什么想法吗?

docker dockerfile docker-container
1个回答
0
投票

使用 Docker 时,Dockerfile 中的每个 RUN 命令都在新的 shell 会话中执行。这意味着如果您通过获取带有 . /tmp/env/var.env 在 RUN 指令中,这些变量仅在该 shell 会话期间可用。一旦 RUN 命令完成,shell 会话就会结束,所有设置的环境变量都会丢失。

要使环境变量持久存在并在容器启动时可用,您可以在 Dockerfile 中使用 ENV 指令。您可以这样做:

您可以在 Dockerfile 中设置静态环境变量:如果您事先知道环境变量,则可以使用 ENV 指令直接在 Dockerfile 中设置它们。

ENV MY_VARIABLE=myValue
ENV ANOTHER_VARIABLE=anotherValue

或者您可以使用 .env 文件:如果您希望使用 .env 文件来设置环境变量,一种方法是编写一个脚本(或 Dockerfile 中的内联 shell 命令)来读取 .env 文件并对每个变量使用 ENV 指令。然而,这种方法需要一些脚本,并且超出了 Docker 的标准处理。

对于大多数用例,建议直接使用 ENV 指令在 Dockerfile 中设置环境变量。这可确保变量设置正确,并且可用于 Docker 映像构建期间运行的所有命令以及启动时的容器。

如果您绝对需要在容器启动时从 .env 文件加载变量,请考虑在启动命令或入口点脚本 (ENTRYPOINT) 中添加一个步骤,以在启动主应用程序之前获取 .env 文件。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.