【问题标题】:How can I pass the variables I have placed in the .env file to the containers in my docker swarm?如何将放置在 .env 文件中的变量传递给 docker swarm 中的容器?
【发布时间】:2019-11-01 23:27:22
【问题描述】:

我正在尝试对 docker-composeswarm 使用相同的 docker-compose.yml.env 文件.env 文件中的变量应该通过 sed 解析为配置文件,方法是在启动时运行 run.sh 脚本。此设置在使用 docker-compose up 命令时工作正常,但在我使用 docker stack deploy 命令时它们没有通过。

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

【问题讨论】:

  • 请分享 docker-compose 文件和完整的命令,这些命令对你有效或无效。解析env是什么意思。变量?你的意思是使用他们的价值观?
  • 使用 .env 文件解析变量是处理变量的事实上的方式。解释什么是解析和变量超出了这个问题的范围。没有必要共享文件,因为这是一个高层次的问题,因为那只会混淆视听。

标签: docker docker-compose environment-variables docker-swarm docker-stack


【解决方案1】:

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

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

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

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

或者您可以使用 envsubst 替换变量以使用已扩展的变量创建一个撰写文件:

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

【讨论】:

  • 我不确定这是否解决了“docker swarm”组件。
  • @Octavian 第一个选项获取 env 并使用 swarm 进行部署。第二个和第三个选项构建一个可以使用 swarm 部署的 compose 文件。 docker stack 是 swarm 模式命令,compose yml 文件是该命令的输入。
  • 这似乎是正确的答案,但我无法弄清楚 docker-compose.processed.yml 应该是什么。
  • 处理后的文件是展开变量的compose文件。您部署它是因为当您使用 compose 文件部署堆栈时,swarm 模式不会查看 .env 文件。
【解决方案2】:

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

web:
  env_file:
    - web-variables.env

作为docs 状态:

您可以使用“env_file”选项将多个环境变量从外部文件传递到服务的容器

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

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

作为DocsDocs2Docs3 状态:

您在此处定义的环境变量用于变量 在您的 Compose 文件中替换

您可以使用 .env 为环境变量设置默认值 Compose 自动查找的文件

所以如果撰写文件包含:

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

.env 将包含:

POSTGRES_VERSION=4.0

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

.env 文件功能仅在您使用 docker-compose up 时有效 命令并且不适用于 docker stack deploy

【讨论】:

  • 感谢您的点缀,但我相信这一切的总结只是docker-compose自动搜索.env文件,但docker stack 没有;它必须在 yaml 文件中使用env_file: 指定。我的答案是正确的答案;这是对我最初发布的问题的准确答案。
【解决方案3】:

实际上我发现最好/最简单的方法就是将此参数添加到 docker-compose.yml 文件中:

env_file:
  - .env 

【讨论】:

  • 请注意,这是与 .env 文件不同的行为,后者在 compose yaml 文件本身中扩展变量。它将变量注入正在部署的容器的环境中。 compose 文件和部署的容器是两个不同的环境。
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 2018-12-23
  • 2020-10-29
  • 2021-06-03
  • 2020-03-15
相关资源
最近更新 更多