gpt4 book ai didi

docker - 如何在容器运行时在 docker-compose.yml 中替换服务命令中的环境变量?

转载 作者:行者123 更新时间:2023-12-04 07:13:23 27 4
gpt4 key购买 nike

下面的docker-compose.yml定义了command,里面包含了一个环境变量FOO

version: '3.7'
services:
tmp:
image: alpine
environment:
FOO: foo
command: ["echo", "${FOO:-foobar}"]

如果你跑

docker-compose -p app up

并查看容器的日志使用

docker logs app_tmp_1

你看

foobar

由于环境变量FOO被替换,当/之前docker-compose.yml被解析/读取。如果环境变量 FOO 将在容器 app_tmp_1 的运行时被替换,输出将是

foo

因为容器配置了环境变量FOO=foo

如何配置 command 以在容器 app_tmp_1 的运行时替换/评估环境变量(即示例中的输出 foo)?

最佳答案

编辑:

您可以在 docker-compose.yml 中转义环境变量(双美元符号 $$ 而不是一个 $)以防止它在容器的命令中被替换。但是,由于替换应该在运行时完成,因此必须在容器中运行一个 shell(命令)来执行替换,例如

version: '3.7'
services:
tmp:
image: alpine
environment:
FOO: foo
command: sh -c 'echo "$${FOO:-foobar}"'

旧答案:

我刚刚发现嵌套的环境变量没有被替换。

version: '3.7'
services:
tmp:
image: alpine
environment:
FOO: foo
command: sh -c 'echo FOO is "${FOO_OVERWRITE:-${FOO:-foobar}}" && env'

如果你跑

docker-compose -p app up

你得到

# echo output
FOO is foo
# env output
FOO=foo

即使你运行,你也会得到同样的结果

FOO=ignored docker-compose -p app up

但是,如果你运行

FOO_OVERWRITE=overwritten docker-compose -p app up

你得到

# echo output
FOO is overwritten}
# env output
FOO=foo

覆盖可能不起作用,因为 } 是输出的一部分。考虑到这一点,您不应该使用此解决方案;)

Note: You do not get } if you run the same command in a shell (no Docker involved):

$ sh -c 'echo FOO is "${FOO_OVERWRITE:-${FOO:-foobar}}"' 
FOO is foobar

如果容器中没有定义环境变量,即移除

    environment:
FOO: foo

来自docker-compose.yml,即

version: '3.7'
services:
tmp:
image: alpine
command: sh -c 'echo FOO is "${FOO_OVERWRITE:-${FOO:-foobar}}" && env'

你得到命令中定义的默认值

# echo output
FOO is foobar
# env output does not contain FOO

Docker Compose 版本 1.26.0

关于docker - 如何在容器运行时在 docker-compose.yml 中替换服务命令中的环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68933089/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com