Docker-compose没有读取环境变量

3
尝试使用docker-compose时,似乎无法读取来自主机系统的导出环境变量。
在撰写本文时,完整的相关代码可在 这里 找到。 $ docker info
Client: Docker Engine - Community
Version:           19.03.6
API version:       1.40
Go version:        go1.12.16
Git commit:        369ce74a3c
Built:             Thu Feb 13 01:27:58 2020
OS/Arch:           linux/amd64
Experimental:      false
Server: Docker Engine - Community
Engine:
Version:          19.03.8
API version:      1.40 (minimum version 1.12)
Go version:       go1.12.17
Git commit:       afacb8b
Built:            Wed Mar 11 01:29:16 2020
OS/Arch:          linux/amd64
Experimental:     false
containerd:
Version:          v1.2.13
GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version:          1.0.0-rc10
GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version:          0.18.0
GitCommit:        fec3683

$ docker-compose info

docker-compose version 1.21.0, build unknown
docker-py version: 3.4.1  
CPython version: 3.7.3    
OpenSSL version: OpenSSL 1.1.1d  10 Sep 2019 

具体来说,我对文件docker-compose.yml及其部分environment感兴趣。

version: "3"
...
environment:
    - FERRO_MONGO_HOST=ferro-mongo
    - FERRO_MONGO_USER=ferrothorn
    - FERRO_MONGO_PASS=ferrothorn-local
    - FERRO_MONGO_BASE=ferrothorn
    - FERRO_LOG_LEVEL=1
    - FERRO_SECRET

当调用docker-compose up时,环境变量的设置方式符合我在查看docker-compose文件时的预期。然而,如果我导出某些变量,那么导出到shell的变量不会覆盖docker-compose文件中定义的默认值。这适用于像FERRO_SECRET这样没有默认值的变量以及设置了默认值的FERRO_LOG_LEVEL等变量。
我使用的命令序列如下:
export FERRO_SECRET=very_secret_pw
export FERRO_LOG_LEVEL=2
docker-compose up --build # tried with and without --build flag

如果它还是不能正常工作,我也尝试了在网上看到的技巧。

FERRO_SECRET=very_secret_pw FERRO_LOG_LEVEL=2 docker-compose up --build

但是没有结果。

由于此框实际上是在 Windows 10 上运行的 WSL 实例,使用本地主机 Docker 服务器,我认为可能有一些 bug,但是在同一台计算机上的 Windows PowerShell 中重新创建这些步骤会产生相同的结果,而在常规 Fedora 服务器框中构建也是如此。

我是否设置环境变量错误?我似乎记得在某个地方这样做并且它可以工作,这个 docker-compose 版本或我的配置是否存在某些 bug?

1个回答

2
看起来Docker将等号后面的值解释为文字。
请查看https://docs.docker.com/compose/compose-file/#variable-substitution。 它提到使用env文件设置默认值或内联设置。它还使用美元符号和大括号表示变量。
例如: - MY_VAR=${MY_ENV_VAR:my_var_default_value}
在我的所有情况中,我都是以"$"开头进行替换。在某些情况下,我还会用大括号括起来。
例如: FERRO_LOG_LEVEL=${FERRO_LOG_LEVEL:1} FERRO_SECRET=${FERRO_SECRET}

1
Docker在=后解释变量的方式是按预期工作的,这就是它们被分配默认值的方式。实际上应该发生的是我导出变量名本身。如果您注意到我的问题,我导出FERRO_LOG和FERRO_SECRET,没有任何=之后的内容。我已经阅读了有关变量替换和使用.env文件的信息,但这不是我想要的用例,因为我希望直接从环境中提取它。 - gastrodon
1
我在我的答案中更新了一些内容,希望能够适用于你的docker-compose文件。 - Rich
1
这看起来比我最初想使用的更有用,感谢您的帮助。 - gastrodon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接