如果您使用的是 docker-compose(现在与 Docker 捆绑在一起),.env 是包含可供 解析器使用的变量的文件的默认文件名 strong> 仅适用于 docker-compose.yml 文件,不适用于构建过程或容器环境变量。
使用--env-file 命令行参数或在您的docker-compose.yml 文件中设置env_file 变量将识别从哪个文件将变量加载到容器环境(而不是构建过程)。您可以从正在运行的容器中的 shell 运行 set 以查看已加载的环境变量。
在 docker-compose.yml 中将 .env 分配给 env_file 是一种常见的反模式,这是一件非常令人困惑的事情,因为它使 .env 文件为 docker-compose.yml 解析器 和正在运行的容器环境提供两个变量 - 这几乎肯定是您阅读本文的原因。
如果您希望 .env 中的变量可用于 构建过程,即您希望在 Dockerfile 中使用它们,那么你需要在 docker-compose.yml 中明确设置它们,并且你需要在 Dockerfile 中加载它们。此示例显示了在 .env、docker-compose.yml 和 Dockerfile 中使用的语法:
# This excerpt is from .env
# ...
# The quotes here are important if you have any special
# characters and want them to work on mac, pc and linux:
ARG_1="value of first argument"
ARG_2="value of second argument"
ARG_3="value of third argument"
# ...
# This excerpt is from docker-compose.yml
# ...
# env_file (.env.staging) is loaded in the container at runtime:
env_file:
- .env.staging
# ...
build:
context: ./
dockerfile: docker/app/Dockerfile
# The following will let you use ${ARG_x} during your build in docker/app/Dockerfile
args:
ARG_1: ${ARG_1}
ARG_2: ${ARG_2}
ARG_3: ${ARG_3}
# ...
# This excerpt is from /docker/app/Dockerfile
FROM somerepo/someimage:ver as something
# Import variables from docker-compose:
ARG ARG_1=$ARG_1
ARG ARG_2=$ARG_2
ARG ARG_3=$ARG_3
# ...
# Now you can use ${ARG_1}, ${ARG_2} etc to reference values from your .env file
# ...