环境变量不会从docker-compose转到容器

前端之家收集整理的这篇文章主要介绍了环境变量不会从docker-compose转到容器 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我试图将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不知道如何获取它们.

如果有人对此有很好的解释,我很高兴阅读它.

猜你在找的Docker相关文章