Docker-compose env文件无法正常工作

时间:2018-01-29 06:39:32

标签: environment-variables docker-compose external

我正在将docker-compose文件写入MySQL实例,并希望使用env文件中的少量变量:这里的文件实际上是这样的:

搬运工-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}

请帮助

3 个答案:

答案 0 :(得分:7)

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

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

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

<强> B:

您需要在docker-compose.yaml所在的文件夹中使用.env文件,以便为docker-compose.yaml文件和泊坞窗容器声明默认环境变量。 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}

答案 1 :(得分:1)

在您添加env_file之后,似乎environment被忽略了。以我的经验,docker-compose似乎有许多这样的“傻”错误。

您的docker-compose.yaml有一些与env文件无关的错误。我纠正了一下。

$ 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文件无关)
  • 如果不提供root权限,则MySQL映像将崩溃。我添加了一个,以便容器可以运行足够长的时间,以使我转储其env并确认已设置变量。
  • 我正在macOS Catalina 19.03.5上使用Docker版本10.15.4

答案 2 :(得分:0)

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

version: '2.4'

services:

  myapp:
    build:
      context: .
    container_name: myapp01xj1
    env_file:
      - .env