问题
我试图让docker-compose.yml中的命令使用容器的内部环境变量,而不是主机系统的环境变量。然而,docker-compose. yml试图用容器外部我自己的shell的环境变量替换命令中的环境变量。
例如,使用以下合成文件:
version: "3.9"
services:
service1:
image: alpine
command: "echo $PATH"
network_mode: bridge
输出包含我自己的shell的PATH,而不是容器内的PATH(该变量将被Docker替换)。
我所尝试的
使用双结雅字符,如here所述。这会产生下列行为:
| YAML语法|控制台输出|
| - -|- -|
| command: "echo ${PATH}"
|(仍然是我自己的shell PATH变量)|
| command: "echo $$PATH"
| $PATH
|
| command: "echo $${PATH}"
| ${PATH}
|
如上所述,我希望控制台输出读取容器中实际PATH变量的值(对于alpine容器,输出应为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
)
我还尝试了command: "printenv"
,它如预期的那样显示了PATH变量的上述内部值,而不是我的shell中的值。
更新1
我还尝试了注解中建议的exec格式,使用以下形式:
command: ["echo", "${PATH}"]
command: ["echo", "$$PATH"]
command: ["echo", "$${PATH}"]
这些仍然给予与上面相同的结果。
其他上下文
操作系统:Ubuntu
撰写版本:版本2.12.2
问题
如何在命令中使用内部环境变量,以便命令的输出将为我提供内部PATH变量的值?
2条答案
按热度按时间xvw2m8pv1#
有关变量替换得Compose文档指出,
$VARIABLE
引用将在docker-compose.yml
文件中得任何位置(包括command:
)替换为相应得 host 环境变量.访问一个 container 环境变量可能会稍微复杂一些,特别是因为一个入口点 Package 器脚本可以在启动时修改容器环境。
1.您需要将文字字符串
echo $PATH
(包括美元符号)传递到容器中;和1.您需要确保运行shell来处理该字符串。
与在Dockerfile中不同,Compose不会将纯字符串
command:
Package 在/bin/sh -c
中,因此您必须自己提供。第一个
但要特别注意双精度值
$$
,它强制将文本$
传递到容器中。(This一些映像被构造成忽略
command:
或者强制它们用一个特定的解释器来运行,你在尝试运行这个命令时会得到一个模糊的错误。)nkoocmlb2#
你需要在你的docker-compose.yaml旁边创建一个.env文件,并把它放在里面:
export ENV_VAR=TESTTEST
还有其他几种技术:https://docs.docker.com/compose/environment-variables/