【问题标题】:docker-compose not reading environment variablesdocker-compose 不读取环境变量
【发布时间】:2020-07-16 07:26:25
【问题描述】:

在尝试使用 docker-compose 时,它​​似乎没有从主机系统读取导出的环境变量。

撰写本文时有问题的完整代码可以在here找到。

$ 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

但没有骰子。

由于这个盒子实际上是一个使用 localhost docker 服务器在 windows 10 上运行的 wsl 实例,我认为它可能存在一些错误,但是在同一台机器上的 windows powershell 中重新创建这些步骤会产生相同的结果,就像在一个普通的 Fedora 服务器盒

我设置环境变量错误吗?我似乎记得在 somewhere 之前做过这个并且它工作正常,这个 docker-compose 版本或我的配置是否有一些错误?

【问题讨论】:

    标签: linux docker docker-compose environment-variables dockerfile


    【解决方案1】:

    看起来 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}

    【讨论】:

    • Docker 在 = 按预期工作后解释变量,这就是为它们分配默认值的方式。应该发生的是我导出变量名本身。如果您在我的问题中注意到,我会导出 FERRO_LOG 和 FERRO_SECRET,= 之后什么都没有。我已经阅读了有关变量替换和使用 .env 文件的信息,尽管这不是我想要的用例,因为我希望它直接从环境中提取。
    • 我更新了我的答案,希望在您的 docker-compose 文件中适用于您的情况。
    • 这看起来比我最初使用的更有用,感谢您的帮助
    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2021-09-30
    • 2023-01-30
    • 1970-01-01
    • 2017-06-16
    • 2022-01-01
    相关资源
    最近更新 更多