【问题标题】:Docker-Compose Environment-Variables blank stringDocker-Compose Environment-Variables 空白字符串
【发布时间】:2021-02-19 16:41:46
【问题描述】:

我正在尝试让 Docker-Compose 中的环境变量工作。我的文件:

env/test.env:

XUSER=you
XHOME=/home/${XUSER}

docker-compose.yml:

version: '3'
    services:
     abc:
        build: .
        image: xyz:latest
        container_name: xyz
        env_file:
          - env/test.env
        user: "${XUSER}"

docker-compose up --build

docker-compose 配置

WARNING: The XUSER variable is not set. Defaulting to a blank string.
    services:
      qernel:
        build:
          context: xyz
        container_name: xyz
        environment:
          XHOME: /home/you
          XUSER: you
        image: xyz:latest
        user: ''

如您所见, user: '' 是一个空字符串,但 env_file 有效。我发现了一些关于这个问题的旧 Bug 报告,我不确定我做错了什么。

【问题讨论】:

    标签: docker docker-compose environment-variables


    【解决方案1】:

    上面写着WARNING: The XUSER variable is not set. Defaulting to a blank string.,因为${XUSER} 在执行时不存在:

    user: "${XUSER}"
    

    ${XUSER} 不在您的环境中(您可以通过运行:env | grep XUSER 来验证这一点,它应该什么也不输出),并且 docker-compose 没有找到同一级别的任何 .env 文件或没有 .env 文件在您运行 docker-compose up --builddocker-compose config 时通过了

    灵活的解决方案:

    env/test.env 重命名为.env,并将其放在您的docker-compose 文件的文件夹容器的根目录中,以便docker 自动解析它。

    或使用:

    docker-compose --env-file path/to/env/test.env up --build
    docker-compose --env-file path/to/env/test.env config
    

    永久解决方案:

    通过运行在您的环境中手动导出它们:

    export XUSER=you && export XHOME=/home/${XUSER}
    

    或者您使用您的env/test.env 文件作为源(请注意,您需要使用“export”作为前缀):

    env/test.env:

    export XUSER=you
    export XHOME=/home/${XUSER}
    

    然后你运行 . /path/to/env/test.envsource /path/to/env/test.env

    【讨论】:

      【解决方案2】:

      你需要做的是在你的 docker-compose.yml 文件的同一目录下创建 .env 文件,.env的内容是:

      XUSER=user1
      

      然后运行docker-compose config

      参考:https://docs.docker.com/compose/environment-variables/

      【讨论】:

        【解决方案3】:

        虽然其他答案都是正确的,但它们并没有充分突出潜在的误解:

        使用env_file 选项,您可以指定一个文件,其中包含要注入到环境中的变量在容器中

        docker-compose.yml 中使用variable substitution,您可以访问环境docker-compose 命令 中的变量,即在主机上。 您可以使用 OS/shell 的常用机制来设置这些,例如在bash:

        export XUSER=you
        docker-compose up
        

        除了docker-compose,您还可以在当前目录中使用.env file

        因此,在您的具体示例中,您只需将env/test.env 移动到.env 以将变量添加到docker-compose 的环境中以进行变量替换。 如果您还想将它们添加到容器中的环境中,您可以这样做:

        version: '3'
        services:
          abc:
            build: .
            image: xyz:latest
            container_name: xyz
        
            # add variables from the docker-compose environment to the container:
            environment:
              - XUSER=$XUSER
              # or even shorter:
              - XHOME
        
            # use variable from the docker-compose environment in the config:
            user: "${XUSER}"
        

        【讨论】:

          【解决方案4】:

          由于 +1.28 .env 文件被放置在项目根目录中,而不是执行 docker-compose 的位置。如果您这样做,变量将被自动拉出以供容器使用。

          这在开发中非常有用,尤其是使用绑定挂载卷以使 .env 可用于在项目根目录中组合,而无需通过在 .dockerignore 中包含 .env 来进行映像构建

          但在生产中,我不习惯将它包含在我的项目根目录中,尤其是因为我从 github 拉取这些项目文件。 Compose 文件期望它们在生产环境中替换为替换 SECRET_VAR=${SECRET_VAR}

          因此,一种 hack 解决方案是将 .env 文件放在我的生产目录树的高处,远离我的项目(理想情况下,这些文件来自托管服务上的环境存储,或另一个加密存储),但注入这些在运行时使用 Compose 中的 --env_file 标志将变量放入容器中。

          env_file 标志的工作方式如下: docker-compose -f docker-compose.prod.yml --env-file ../.env up -d

          它在the docs

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-16
            • 1970-01-01
            • 2015-01-23
            • 2012-03-21
            • 1970-01-01
            • 2016-05-30
            相关资源
            最近更新 更多