【发布时间】:2022-11-17 02:46:24
【问题描述】:
问题
我试图让 docker-compose.yml 中的命令使用容器的内部环境变量,而不是主机系统的环境变量。但是,docker compose 尝试在容器外用我自己的 shell 替换命令中的环境变量。
例如。使用以下撰写文件:
version: "3.9"
services:
service1:
image: alpine
command: "echo $PATH"
network_mode: bridge
输出包含我自己的 shell 的 PATH,而不是容器内的 PATH(该变量正在被 Docker 替换)。
注意:通过查看 official docs,我也不希望我的变量被本地值替换,因为停靠栏中的格式表明这仅适用于大括号。
我试过的
使用 here 所述的双美元字符。这给了我以下行为:
| YAML syntax | Console Output |
|---|---|
command: "echo ${PATH}" |
(Still my own shell PATH variable) |
command: "echo $$PATH" |
$PATH |
command: "echo $${PATH}" |
${PATH} |
如上所述,我希望控制台输出读取容器中实际 PATH 变量的值(对于高山容器,输出应为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)
我也试过 command: "printenv",正如预期的那样,它显示了 PATH 变量的上述内部值,而不是我的 shell 中的值。
更新1
我还尝试了 cmets 中建议的 exec 格式,格式如下:
command: ["echo", "${PATH}"]command: ["echo", "$$PATH"]-
command: ["echo", "$${PATH}"]这些仍然给出与上述相同的结果。
附加上下文
操作系统:Ubuntu 22.04
编写版本:v2.12.2
问题
我如何在命令中使用内部环境变量,以便我的命令的输出将给我内部 PATH 变量的值?
【问题讨论】:
-
command可以有 shell 格式(你正在使用的格式)或 exec 格式(推荐)。也许这就是正在发生的事情。看这里docs.docker.com/engine/reference/builder/#cmd -
@JoaoVitorino 感谢您的评论!我也试过 exec 形式,但它给出了相同的结果(见上面的更新)。请注意,我已将我的示例编辑为使用 $PATH 变量,以便更清楚地表明我想要使用内部容器环境变量。
标签: docker docker-compose