【问题标题】:Is there a way to provide docker-compose env-file from stdin?有没有办法从标准输入提供 docker-compose env-file?
【发布时间】:2021-09-22 08:26:05
【问题描述】:

在 docker run 中可以做到

docker run --env-file <(env | grep ^APP_) ...

docker-compose 有类似的方法吗? 我想避免物理环境文件。

【问题讨论】:

  • 您也可以使用--env-file 作为docker-compose 的选项,它记录在here。您可以尝试,但我不确定它是否有效,因为根据我的经验,docker-compose 不喜欢 env 文件,除非文件名为 .env,但也许我只是不走运。
  • @MarcoLuzzara 不幸的是,compose 不接受非物理输入 ERROR: /dev/fd/63 is not a file.

标签: docker docker-compose environment-variables


【解决方案1】:

docker-compose 中 docker cli 的 --env-file 选项等效于 docker-compose 文件中的 env_file 配置选项。但我认为这需要一个物理 .env 文件。

如果您想使用主机的环境变量,您可以在 docker-compose 中定义它们(带有可选的备用值):


version: "3.9"
services:
  app:
    image: myapp
    environment:
    - APP_MYVAR=${APP_MYVAR-fallbackvalue}

它不像对 ^APP_ 变量进行 grep 那样方便,而是避免物理文件的一种方法。

【讨论】:

    【解决方案2】:

    您可以通过提供多个撰写文件来做到这一点,如 here 所述。在您的情况下,第一个是物理docker-compose.yml,第二个是仅包含所需服务的环境变量的 Compose。显然,环境变量必须正确格式化,因此需要在字符串 - 前面加上 sed,因为它们是作为 YAML 列表添加的。

    docker-compose -f docker-compose.yml -f <(printf "services:
      your_service:
        environment:\n$(env | grep ^APP_ | sed -e "s/^/    - /")"
    ) up
    

    这就是 Docker 的行为方式:

    当您提供多个文件时,Compose 会将它们组合成一个配置。 Compose 按照您提供文件的顺序构建配置。后续文件覆盖并添加到其前任文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 2020-07-11
      • 2019-01-31
      相关资源
      最近更新 更多