Docker-compose env文件不起作用

Posted

技术标签:

【中文标题】Docker-compose env文件不起作用【英文标题】:Docker-compose env file not working 【发布时间】: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

请帮忙

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Docker-compose env文件不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Apollo 网关在 docker-compose 中不起作用

节点脚本可执行文件在 Mac 上不起作用:env: node\r: 没有这样的文件或目录

使用 NGINX 作为反向代理的 docker-compose 不起作用:/

.env 文件中的 MySQL 密码不起作用,但在 database.php 中工作正常(env() 缓存旧密码,config:clear 不会删除它)

如何从.env文件获取环境变量到docker-compose.yml?

来自 docker-compose .env 文件的多个 Docker 构建参数