[英]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.