【问题标题】:Use system environment variables in env_files in docker-compose.yml在 docker-compose.yml 的 env_files 中使用系统环境变量
【发布时间】:2020-12-27 03:15:05
【问题描述】:

我有一个名为 myenvfile.env 的 env 文件,它希望从系统环境变量中定义。

.env

SYSTEM_ENV_VAR=prefix

myenvfile.env

MY_COMPOSED_ENV_VAR=${SYSTEM_ENV_VAR}_suffix

docker-compose.yml

version: '3.4'

services:
  myservice:
    env_file: 
      - env_files/myenvfile.env

但是当我使用docker-compose up -d 创建容器时,我会查看容器环境变量和MY_COMPOSED_ENV_VAR = "${SYSTEM_ENV_VAR}_suffix" 而不是所需的"prefix_suffix"

我怎样才能做到这一点?谢谢

编辑:更多信息

如果我在 Jenkins 作业中定义 SYSTEM_ENV_VAR,例如,它适用于 Linux 和 Windows。但是,如果我尝试在 shell 中执行此操作,则它在 Windows 中不起作用。

【问题讨论】:

  • .env 也是文件吗?它是如何使用的?
  • @GintsGints,我已经发布了.env 的内容。如果您有任何想法,请告诉我。
  • 这是一个非常以 Windows 为中心的问题。 Linux 甚至没有单独的“用户”和“系统”环境变量的概念(它们是严格的每个进程的属性,仅此而已)。
  • 我没有区分“用户”和“系统”环境变量,而是“系统”(我可以在 shell 中访问)和“内部 docker”变量。例如,我想参数化一个 IP 地址,并且我想定义不同的 docker,每个 docker 都组成它的变量,例如MYVAR=${IP_ADDR}:${MYPORT}/anystring/。我在 docker 中需要 MYVAR(这就是我在 myenvfile.env 中定义它的原因)并且我的系统中有 IP_ADDR。
  • 当您说“在我的系统中”时——哪个特定进程?特别是,它是否设置在启动docker-compose 命令的进程中?

标签: docker docker-compose environment-variables


【解决方案1】:

尝试在docker-compose up 命令之前声明SYSTEM_ENV_VAR,类似于:

$ export SYSTEM_ENV_VAR=test
$ docker-compose up

您会看到它会正确展开。

发生这种行为是因为 SYSTEM_ENV_VAR 预计会在 docker-compose up 命令之前声明,因为它不会使用在容器创建瞬间中声明的环境变量进行扩展(env_file 关键部分,对于示例),仅 docker-compose 运行时已经可用的那些。

这就是 Jenkins 工作在这种情况下有效的原因。

【讨论】:

  • 不,我试过了,如果你在docker-compose up 之前执行export SYSTEM_ENV_VAR=test,它就不起作用。如果您执行 source env.sh 并且在 env.sh 中您有该导出,它可以在 linux 中运行。顺便问一下,它如何与 docker for Windows 一起工作?
  • 您是否在与docker-compose up 相同的bash 会话中运行导出?我已经在linuxWindows 以及checked the source code 中进行了测试。似乎问题中缺少一些东西。另外,在您的上下文中,env.sh 是什么?
  • 是的,我在同一个 bash 中运行。 env.sh 在我的上下文中。
  • 是的,但是你如何运行env.sh?您是否介意扩展您的问题以包含这些步骤(env.shdocker-compose up 等),以及包含有关运行这些命令(Linux bash、Windows CMD、Jenkins 管道等)的会话的信息?
  • 完全正确。如果我在 linux 中运行 env.sh 它将不起作用。如果我在 Linux 中运行source ./env.sh,它就可以工作。在詹金斯它有效。在 Windows CMD 中它不起作用
【解决方案2】:

.env 文件仅在 docker compose 开始时使用,方法是将 $VARIABLE 替换为 .env 文件中给出的值。所以你不能指望它更新你的 myenvfile.env 文件的内容。 (查看this

相反,您应该在 docker-compose.yaml 中声明新的环境变量,例如:

environment:
    - MY_COMPOSED_ENV_VAR=${SYSTEM_ENV_VAR}_suffix

【讨论】:

  • 这不是真的。如果我在 Linux 中使用 source 命令定义变量,它会更新它的内容,如果你在 Jenkins 中定义 env var,它也会更新 myenvfile.env。唯一没有更新 myenvfile.env 的情况是在 Windows 中。
猜你喜欢
  • 2016-07-16
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 2020-02-01
  • 2020-05-29
相关资源
最近更新 更多