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

时间:2019-06-06 14:40:25

标签: docker 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,而且我不相信图像中正在运行的应用程序能够读取该值。

1 个答案:

答案 0 :(得分:2)

在运行时容器 中有一个变量,而docker-compose.yml中的启动时间中有此变量是不同的。 Compose无法使用文件environment部分中的变量替换配置文件中的变量-您正在command部分中尝试这样做,但是您必须使用an .env file来完成此操作工作。

或者像您一样,使用$$语法阻止Compose to evaluate a variable,但让它在容器中执行被调用的Shell。

尽管environment部分中的变量可用于容器。您可以通过以下最小示例进行检查:

  • 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

因此,容器内的应用程序应该没有问题可以获取此变量。

对于为什么command: echo $$foo完全不起作用的原因,我不确定。我相信,如果您将echo用作ENTRYPOINT(因为没有定义其他ENTRYPOINT in the Dockerfile),那么启动容器时就不会有Shell,因为您会覆盖默认的/bin/bash。当没有Shell被“包装”时,echo本身似乎无法从环境中读取变量。尽管变量明显存在(使用commmand: envdocker-compose up进行检查),但是echo不知道如何获取它们。

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