如何为docker-compose服务设置默认环境变量?

3
考虑以下示例:

Dockerfile

FROM ubuntu

ENV var=hello

ENTRYPOINT ["printenv"]

这个容器有一个带有默认值的环境变量,我可以覆盖它:

docker build -t exp .
docker run exp

...
var=hello
...

docker run -e var=lalala exp

...
var=lalala
...

我希望在使用docker-compose时,能够具有这种可选的覆盖性。到目前为止,我尝试了以下三种方法:

强制覆盖 - 否则变量未设置

docker-compose.yml

version: "3.1"

services:
  hello-teller:
    image: exp:latest
    environment:
      - var

结果:

docker-compose up

var未设置,忽略默认值。

env var=lala docker-compose up

var 被覆盖。

铭记于心

docker-compose.yml

version: "3.1"

services:
  hello-teller:
    image: exp:latest
    environment:
      - var=lala

结果:

docker-compose up

var 被覆盖为 lala

env var=huhu docker-compose up

var 仍被覆盖为 lala

没有效果

docker-compose.yml

version: "3.1"

services:
  hello-teller:
    image: exp:latest
    environment:
      - ${var:-lala}

结果:

docker-compose up

var 没有被覆盖。

env var=huhu docker-compose up

var 没有被覆盖。

1个回答

1
根据文档,使用2.1文件格式可以实现以下功能:

支持$VARIABLE和${VARIABLE}语法。此外,在使用2.1文件格式时,可以使用典型的shell语法提供内联默认值:

${VARIABLE:-default}如果环境中未设置或为空,则计算为默认值。${VARIABLE-default}仅在环境中未设置变量时计算为默认值。

因此,像你在问题中展示的${var:-lala}是正确的方法,但你似乎缺少左侧。完整的行应该是:
- var=${var:-lala}

我在我的环境中测试了语法,它可以正常工作。要使用您的示例,我将通过以下两种方式之一覆盖变量:

1)将变量导出到环境中,例如:

export var=happy
sudo -E docker-compose up

2) 直接传递环境变量

var=kind sudo -E docker-compose up

请注意,我在使用sudo时使用-E选项以保留现有的环境变量。如果有一个类似于alias docker-compose='sudo docker-compose'的别名,这很容易被忘记。

一种选择是修复该别名,或者我的个人偏好:alias sudo='sudo -E'

顺便说一下,如果在SSH上运行docker-compose,选项2是我的首选。

使用env文件

另一种选择是使用env文件

运行时环境中存在的值始终覆盖在.env文件中定义的值。同样,通过命令行参数传递的值也具有优先权。


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