当我在另一个目录中使用docker-compose -f时,不会读取env文件

时间:2017-12-04 10:32:54

标签: docker docker-compose

我的Docker .env文件存在问题。当我在我的Docker文件夹(我有docker-compose.yml.env文件)时,环境变量从.env读取。但是,当我在更高级别的目录中运行docker-compose -f ./docker/docker-compose.yml up --build -d时,我收到警告:

The MYSQL_ROOT_PASSWORD variable is not set. Defaulting to a blank string. 

有没有人遇到过这个问题?我尝试在env_file中设置docker-compose.yml属性并使用其他文件编码(我在Google中找到了这个解决方案)但仍然没有。

这是我的配置:

version: '2'

services:
    mysql:
        container_name: mysql
        image: mysql
        volumes:
            - "./.data/db:/var/lib/mysql"
        environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}

.env文件:

# MySQL
MYSQL_ROOT_PASSWORD=test
MYSQL_DATABASE=test
MYSQL_USER=test
MYSQL_PASSWORD=test

2 个答案:

答案 0 :(得分:1)

正如Tagc所说,这是带有.env文件的docker-compose的记录行为,它必须位于您运行docker-compose的目录中。您无法使用env_file,因为这是设置不同的环境。 .env文件设置docker-compose用于解析yml文件的环境(因此无法在文件中设置,这将是循环依赖),而env_file注入环境变量进入运行容器。

如果由于某种原因无法进入文件夹或移动.env文件,您可以手动使用以下内容来源文件:

env $(cat docker/.env | grep -v ^# | xargs) \
  docker-compose -f docker/docker-compose.yml up --build -d

答案 1 :(得分:0)

可能有一个解决方法,但它很麻烦,我什至不确定它在所有条件下都有效。我刚刚从这个文件夹 tree:

开始尝试过
├── compose
│   └── docker-compose.test.yml
├── configs
│   └── .conf
└── envs
    └── .env

还有这个 Docker-compose:

services:
  testing_container:
    image: mongo
    container_name: tester
    volumes:
      - ../configs/.conf:/etc/configs/.conf
    environment:
      MONGO_PORT: ${MONGO_PORT}
    ports: 
      - "${MONGO_PORT}:27017"
    env_file:
      - .env

然后我运行它:

docker-compose -f compose/docker-compose.test.yml --project-directory ./envs up -d

在可能的选项中,--project-directory 会覆盖默认工作目录,诱使 docker 在 envs 文件夹中查找 .env 文件,而不是 compose 文件夹。如果您仔细查看前面的 docker-compose.test.yml,您会立即注意到您也必须适应所有其他路径,例如绑定体积 ../configs/.conf,它现在相对于 envs文件夹。

老实说,除非你真的别无选择,否则我不会推荐它。