如何将我放在 .env 文件中的变量传递到我的 docker 群中的容器?

How can I pass the variables I have placed in the .env file to the containers in my docker swarm?

我正在尝试为两个docker-composeswarm.env 文件中的变量应该通过 sed 在引导时由 运行 和 run.sh 脚本解析到配置文件中。此设置在使用 docker-compose up 命令时工作正常,但当我使用 docker stack deploy 命令时它们没有通过。

如何将变量传递到容器中,以便 run.sh 脚本在启动时解析它们?

加载 .env 文件是 docker-compose 的一项功能,它不是 docker CLI 的一部分。在执行部署之前,您可以在 shell 中手动加载此文件的内容:

set -a; . ./.env; set +a
docker stack deploy -c docker-compose.yml stack_name

其他选项包括使用 docker-compose 预处理撰写文件:

docker-compose config >docker-compose.processed.yml

或者您可以使用 envsubst 替换变量,以使用已展开的变量制作一个 compose 文件:

set -a; . ./.env; set +a
envsubst <docker-compose.yml >docker-compose.processed.yml

实际上我发现 best/easiest 方法是将此参数添加到 docker-compose.yml 文件中:

env_file:
  - .env 

要将 shell 环境变量传递给容器,请使用 env_file 语法:

web:
  env_file:
    - web-variables.env

作为docs状态:

You can pass multiple environment variables from an external file through to a service’s containers with the ‘env_file’ option

但是,使用 .env 作为外部文件名可能会导致意外结果并且在语义上存在问题。

.env 放置在 docker-compose 命令用于不同目的的文件夹中:

作为Docs, Docs2, Docs3状态:

The environment variables you define here are used for variable substitution in your Compose file

You can set default values for environment variables using a .env file, which Compose automatically looks for

所以如果撰写文件包含:

db:
  image: "postgres:${POSTGRES_VERSION}"

.env 将包含:

POSTGRES_VERSION=4.0

此功能确实只在 compose 中有效:

The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy