我试图将ENV_VAR传递给容器,但无法正常工作.
@H_404_6@version: '3.7' services: ubuntu: image: ubuntu:latest environment: - ENV_VAR=teste command: "echo ${ENV_VAR}"
问题是使用$$代替$来解决的:
@H_404_6@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
@H_404_6@version: "3.7" services: foo: image: ubuntu container_name: ubuntu environment: - foo=bar command: sleep 3
@H_404_6@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不知道如何获取它们.
如果有人对此有很好的解释,我很高兴阅读它.