Docker-Compose Environment-Variables 空白字符串

dhd*_*d80 2 environment-variables docker docker-compose

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

环境/测试.env:

XUSER=you
XHOME=/home/${XUSER}
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml:

version: '3'
    services:
     abc:
        build: .
        image: xyz:latest
        container_name: xyz
        env_file:
          - env/test.env
        user: "${XUSER}"
Run Code Online (Sandbox Code Playgroud)

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: ''
Run Code Online (Sandbox Code Playgroud)

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

小智 7

您需要做的是在与 docker-compose.yml 文件相同的目录中创建 .env 文件,.env的内容是:

XUSER=user1
Run Code Online (Sandbox Code Playgroud)

然后运行 docker-compose config

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


chu*_*lit 7

升级到 Docker Desktop 4.12.0 后我也开始遇到这个问题。此错误开始发生在 内带引号的字符串.env(当使用env_file加载变量时docker-compose.yml)。在这种情况下,请务必使用单引号而不是双引号,即

MY_VAR='foo$bar'
# ... instead of...
MY_VAR="foo$bar"
Run Code Online (Sandbox Code Playgroud)


mxl*_*lhz 5

它说WARNING: The XUSER variable is not set. Defaulting to a blank string.因为${XUSER}在执行时不存在:

user: "${XUSER}"
Run Code Online (Sandbox Code Playgroud)

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

灵活的解决方案:

重命名env/test.env.env和将它放在一个文件夹容器的根的docker-compose文件,使泊坞窗自动解析它。

或使用:

docker-compose --env-file path/to/env/test.env up --build
docker-compose --env-file path/to/env/test.env config
Run Code Online (Sandbox Code Playgroud)

永久解决方案:

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

export XUSER=you && export XHOME=/home/${XUSER}
Run Code Online (Sandbox Code Playgroud)

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

env/test.env

export XUSER=you
export XHOME=/home/${XUSER}
Run Code Online (Sandbox Code Playgroud)

然后你的跑步. /path/to/env/test.envsource /path/to/env/test.env


acr*_*ran 5

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

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

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

export XUSER=you
docker-compose up
Run Code Online (Sandbox Code Playgroud)

此外,docker-compose您可以使用当前目录中.env文件

因此,在你具体的例子你应该移动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}"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这也适用于使用“--env-file”命令行选项,例如“docker compose --env-file file.env” (2认同)

Gen*_*ovo 5

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

这在开发中非常有效,特别是使用绑定安装卷可以.env在项目根目录中进行组合,而无需通过包含.env在来进入映像构建.dockerignore

但在生产中,我不太愿意将其包含在我的项目根目录中,特别是因为我是从 github 上拉取这些项目文件的。Compose 文件期望它们在生产环境中进行替换SECRET_VAR=${SECRET_VAR}

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

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

它在文档中