【问题标题】:Docker-compose env file not workingDocker-compose env文件不起作用
【发布时间】:2018-07-07 19:38:09
【问题描述】:

我正在编写 docker-compose 文件来启动 MySQL 实例,并希望使用 env 文件中的一些变量:这些文件实际上是这样的:

docker-compose.yml

version: '3.3'
services:
  db:
    image: mysql
    restart: always
    env_file:
      - ./imran.env
    environment:
      MYSQL_ROOT_PASSWORD: ${PASS}
    ports:
      - ${PORT1}: ${PORT2}

imran.env

PASS=imran123
PORT1=3306
PORT2=3306

我得到以下错误,而不是正常工作:

WARNING: The PASS variable is not set. Defaulting to a blank string.
WARNING: The PORT2 variable is not set. Defaulting to a blank string.
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.db.ports contains unsupported option: '${PORT1}

请帮忙

【问题讨论】:

    标签: environment-variables docker-compose external


    【解决方案1】:

    您的docker-compose.yaml 文件中有一些问题:

    答:

    端口值之间的space 符号。它应该没有空格:

    ports:
      - ${PORT1}:${PORT2}
    

    乙:

    您需要在docker-compose.yaml 所在的文件夹中使用.env 文件,以便为docker-compose.yaml 文件和docker 容器声明默认环境变量。 env_file 部分仅用于将值放入容器中。

    因此,您应该执行以下操作:

    1.

    将带有 ENV 变量的文件重命名为 .env

    mv imran.env .env
    

    2.

    在后面使用docker-compose.yaml

    version: '3.3'
    services:
      db:
        image: mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: ${PASS}
        ports:
          - ${PORT1}:${PORT2}
    

    【讨论】:

    • @imranahmedani 也许是接受答案的礼貌?
    • 关于 env_file 选项的真正答案是什么,我可以在其中指定外部文件路径,它不起作用?
    • 投反对票。不是正确答案。问题是关于如何明确指定环境文件。
    • > "env_file 部分仅用于将值放入容器中" / 这真是失败。他们应该已经创建了一个选项来为.env 文件指定自定义名称(和目录)...
    【解决方案2】:

    当您在 env_file 后面添加 environment 时,它似乎被忽略了。根据我的经验,docker-compose 似乎有很多这样的“愚蠢”错误。

    您的docker-compose.yaml 有一些与环境文件无关的错误。我稍微更正了一下。

    $ tre
    .
    ├── broken
    │   ├── imran.env
    │   └── docker-compose.yaml
    └── works
        ├── docker-compose.yaml
        └── imran.env
    
    $ bat broken/*
    ───────┬──────────────────────────────────────────────
           │ File: broken/docker-compose.yaml
    ───────┼──────────────────────────────────────────────
       1   │ version: '3.3'
       2   │ services:
       3   │   db:
       4   │     image: mysql
       5   │     restart: always
       6   │     env_file:
       7   │       - ./imran.env
       8   │     environment:
       9   │       MYSQL_ROOT_PASSWORD: ${PASS}
    ───────┴──────────────────────────────────────────────
    ───────┬──────────────────────────────────────────────
           │ File: broken/imran.env
    ───────┼──────────────────────────────────────────────
       1   │ PASS=imran123
       2   │ MYSQL_ROOT_PASSWORD=changeme
       3   │ PORT1=3306
       4   │ PORT2=3306
    ───────┴──────────────────────────────────────────────
    
    $ diff broken works
    diff broken/docker-compose.yaml works/docker-compose.yaml
    8,9d7
    <     environment:
    <       MYSQL_ROOT_PASSWORD: ${PASS}
    

    使用environment,它会失败:

    $ cd broken && docker-compose down && docker-compose up -d
    WARNING: The PASS variable is not set. Defaulting to a blank string.
    Stopping broken_db_1 ... done
    Removing broken_db_1 ... done
    Removing network broken_default
    WARNING: The PASS variable is not set. Defaulting to a blank string.
    Creating network "broken_default" with the default driver
    Creating broken_db_1 ... done
    

    但没有environment,它可以工作:

    $ cd works && docker-compose down && docker-compose up -d
    Removing works_db_1 ... done
    Removing network works_default
    Creating network "works_default" with the default driver
    Creating works_db_1 ... done
    
    $ docker exec -i -t works_db_1 env
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=ac76b84ca072
    TERM=xterm
    PASS=imran123
    MYSQL_ROOT_PASSWORD=changeme
    PORT1=3306
    PORT2=3306
    GOSU_VERSION=1.12
    MYSQL_MAJOR=8.0
    MYSQL_VERSION=8.0.21-1debian10
    HOME=/root
    

    注意事项:

    • Docker-compose 显然不喜欢${PORT1} 中的ports:,你必须给出实际数字。 (在这种情况下,我只是将其删除,因为端口与 env 文件无关)
    • 如果您不提供根通行证,MySQL 映像会崩溃。我添加了一个,以便容器可以运行足够长的时间,以便我转储其环境并确认正在设置变量。
    • 我在 macOS Catalina 10.15.4 上使用 Docker 版本 19.03.5

    【讨论】:

    • 好像来自docs.docker.com/compose/environment-variables/#the-env-file。当你在多个文件中设置相同的环境变量时,这里是 Compose 用来选择使用哪个值的优先级:Compose 文件、Shell 环境变量、环境文件、Dockerfile、Variable is not defined
    • 这是正确答案。
    【解决方案3】:

    我最近必须指定我希望我的容器使用 .env 作为其环境文件,例如:

    version: '2.4'
    
    services:
    
      myapp:
        build:
          context: .
        container_name: myapp01xj1
        env_file:
          - .env
    

    【讨论】:

      【解决方案4】:

      就我而言,我是从项目内的子目录运行docker-compose up(错误地)。 因此,请确保docker-compose.yml 文件和.env 在同一个目录中,并且您在这两个文件所在的同一目录中运行docker-compose up

      【讨论】:

        猜你喜欢
        • 2023-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多