docker-compose不加载yaml文件中定义的其他env文件

时间:2016-12-14 12:26:05

标签: docker docker-compose dockerfile

我对docker-compose.yml中的env_file设置感到很疯狂。 当我将文件命名为.env并将其放在项目的根目录中时,一切正常。拥有这个env文件的要点是拥有多个环境(dev,staging,production),我进行了设置。 一旦我将我的文件命名为不同(例如dev.env并将其放入env文件夹中)并尝试将其加载到我的docker-compose文件中,它就无法工作。

我举了一个简单的例子来说清楚。 为简单起见,我使用一个变量DC_DOCKERFILE,我在其中定义要加载的dockerfile。

文件:根文件夹中的.env

COMPOSE_PROJECT_NAME=test
DC_DOCKERFILE=./Dockerfile.bash.dev

档案:docker-compose.yml

version: "2"

services:
  bash:
    build:
      context: .
      dockerfile: ${DC_DOCKERFILE}

docker-compose config显示一切都很酷,构建也有效:

networks: {}
services:
  bash:
    build:
      context: /devops/myproject
      dockerfile: ./Dockerfile.bash.dev
version: '2.0'
volumes: {}

现在让我感到非常震惊:

  • 在项目的根目录中创建文件夹env
  • 将.env移至./env/dev.env
  • 在我的docker-compose.yml
  • 中添加env_file: ./env/dev.env

env内容与上面内容相同,因此我不会再次发布内容。

我的新docker-compose.yml

version: "2"

services:

  bash:
    env_file: ./env/dev.env
    build:
      context: .
      dockerfile: ${DC_DOCKERFILE}

仅更改,添加env_file设置。

现在我docker-compose config给了我这个:

networks: {}
services:
  bash:
    build:
      context: /devops/myproject
      dockerfile: ''
    environment:
      COMPOSE_PROJECT_NAME: test
      DC_DOCKERFILE: ./Dockerfile.bash.dev
version: '2.0'
volumes: {}
说什么? hack是我的dockerfile设置?

当然docker-compose build也不喜欢这样,并且烦恼:

docker-compose build --force-rm --no-cache                                                                                 
WARNING: The DC_DOCKERFILE variable is not set. Defaulting to a blank string.
Building bash
ERROR: Cannot locate specified Dockerfile: Dockerfile

变量已加载但不知何故未分配。 所以我不明白。 我可能错了,我不能使用env文件在docker-compose.yml文件中使用docker-compose。会不会先通过docker-compose参数或东西以某种方式加载它,但是在我花了那么多时间之后我想知道我是否可以加载它内部:)

感谢您的帮助,地狱是开源和令人敬畏的社区。

和平

1 个答案:

答案 0 :(得分:2)

当执行文件夹docker-compose命令时出现.env 文件时,这些环境变量将用作docker-compose执行和变量替换的环境变量。 (https://docs.docker.com/compose/env-file/)。

但是,当您为服务定义env_file选项时,该服务将从文件中获取这些变量作为环境变量,而不是用于变量替换。