我试图将ENV_VAR传递给容器,但无法正常工作.
version: '3.7'
services:
ubuntu:
image: ubuntu:latest
environment:
- ENV_VAR=teste
command: "echo ${ENV_VAR}"
问题是使用$$代替$来解决的:
version: '3.7'
services:
ubuntu:
image: ubuntu:latest
environment:
- ENV_VAR=teste
command: '/bin/sh -c "echo $$ENV_VAR"'
但是,我不明白为什么我必须调用sh并且我不相信图像中正在运行的应用程序将能够读取此值.
最佳答案
在运行时将变量包含在容器中,而在启动时将其包含在docker-compose.yml中是不同的. Compose不能用配置文件环境部分中的变量替换配置文件中的变量,而您要在命令部分中尝试这样做,但是您必须使用an
.env
file才能完成此工作.
或者,就像您所做的那样,使用$$语法阻止Compose到evaluate a variable,但是让它在容器中执行被调用的Shell.
但是,环境部分中的变量可用于容器.您可以通过以下最小示例进行检查:
> docker-compose.yml
version: "3.7"
services:
foo:
image: ubuntu
container_name: ubuntu
environment:
- foo=bar
command: sleep 3
nico@tuxedo:~/StackOverflow$docker-compose up -d && docker exec ubuntu /bin/sh -c "env | grep foo"
Starting ubuntu ... done
foo=bar
因此,容器内的应用程序应该没有任何问题来获取此变量.
至于到底为什么命令:echo $$foo不起作用,我不确定.我相信,如果将echo用作ENTRYPOINT(因为没有其他定义的ENTRYPOINT in the Dockerfile),那么启动容器时就没有Shell,因为您覆盖了默认的/ bin / bash.当没有Shell被“包装”时,echo本身似乎无法从环境中读取变量.尽管变量显然存在(使用commmand进行检查:env和docker-compose up),但是echo不知道如何获取它们.
如果有人对此有很好的解释,我很高兴阅读它.