【发布时间】:2021-10-26 04:39:22
【问题描述】:
下面的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)?
【问题讨论】:
-
可以放到
.env文件中。 -
这里不使用容器中/的环境变量。它只使用
.env的值,而不是docker-compose.yml中指定的默认值。替换完成的时间是相同的(当解析docker-compose.yml时)。 -
为什么要在容器运行时评估
docker-compose.yml中编写的内容?即使你以某种方式完成了这项工作,它也会非常混乱。尝试使用结构/系统,而不是随心所欲地弯曲它。 -
无论哪种方式都令人困惑;)这取决于您的假设/背景。例如,Docker Compose 中的
command与 Dockerfile 中的CMD的处理方式不同(请参阅reference)。CMD [ "sh", "-c", "echo $HOME" ]在容器运行时替换,但command: [ "sh", "-c", "echo $HOME" ]不替换。 -
此外,很高兴知道替换实际上是如何起作用的,或者什么不起作用。例如,嵌套替换可能在 Docker Compose 中不起作用(请参阅my answer)。
标签: docker docker-compose environment-variables