繁体   English   中英

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

[英]How to set default environment variables for docker-compose services?

考虑这个例子:

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未被覆盖。

根据文档,这可以使用 2.1 文件格式:

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

如果 VARIABLE 在环境中未设置或为空,则 ${VARIABLE:-default} 评估为默认值。 只有在环境中未设置 VARIABLE 时,${VARIABLE-default} 才会评估为默认值。

所以${var:-lala}如您在问题中所示,是通往 go 的方式,但您似乎缺少左侧。 完整的行应该是:

- var=${var:-lala}

我在我的环境中测试了语法并且它有效。 要使用您的示例,我将通过以下两种方式之一覆盖该变量:

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

export var=happy
sudo -E docker-compose up

2)直接传递环境变量

var=kind sudo -E docker-compose up

请注意,我将-E选项与sudo一起使用来保留现有的环境变量。 如果一个人有一个别名,比如alias docker-compose='sudo docker-compose' ,这很容易忘记。

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

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

使用环境文件

另一种选择是使用env 文件

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM