【问题标题】:Override variables in docker-compose env_file with the actual environment from the outside用外部的实际环境覆盖 docker-compose env_file 中的变量
【发布时间】:2019-01-13 15:55:14
【问题描述】:

给定一个非常简单的docker-compose 文件:

version: '3'

services:
  test:
    image: busybox
    env_file:
      - my.env
    command: env

以及其中引用的my.env 文件:

FOO=BAR

运行docker-compose up按预期打印(容器名称前缀默认为父目录的名称):

test_1  | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
test_1  | HOSTNAME=00dc4fa7f38a
test_1  | FOO=BAR
test_1  | HOME=/root
tmp_test_1 exited with code 0

从外部覆盖env_file 中的变量,如FOO=SOMETHING_ELSE docker-compose up,但不会反映在容器中。输出仍将包含FOO=BAR 中定义的my.env

是否有可能以某种方式从外部覆盖env_file 中定义的变量,而不在文件内更改它们?我知道如果我使用以下行扩展我的docker-compose.yml 文件,它将起作用

environment:
  - FOO

但是,这并不能真正扩展到大量变量 - 必须始终确保 env_filedocker-compose.yml 同步以防止出现严重错误。

【问题讨论】:

    标签: docker docker-compose environment-variables env-file


    【解决方案1】:

    至少在docker-compose up 的上下文中,我不知道有什么方法可以满足您的要求。有an option for specifying env vars with docker-compose run):

    docker-compose run -e DEBUG=1 web python console.py
    

    我不确定您的用例是什么,但使用 override files 是我在开发或测试/CI 期间为每个用户定义不同环境变量的最佳方式。

    【讨论】:

    • 我的用例是在env_file 中列出合理的变量默认值,但有可能在从 Jenkins CI 启动我的堆栈时覆盖它们,我将通过构建参数设置它们,最终作为环境变量。我目前的解决方法是将这些环境变量写入文件并用它替换默认的env_file。显然,它不会比这更好。
    • 是的。我通常会得到一个特定于 CI 环境的env_file,我指定了我的 CI 提供程序使用。听起来与您正在做的事情类似。我不知道更好的方法 - 希望其他人会提出另一个建议!
    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2015-06-17
    • 2021-09-02
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多