首页 > 解决方案 > 为什么我需要在 docker-compose.yml 中显式声明 env_file?

问题描述

我扩展了 Wordpress 图像以添加 XDebug、PHPUnit、composer 和 phpcs。

我的项目根目录如下所示:

码头工人-wordpress
    Dockerfile
码头工人-compose.yml
.env

码头工人-compose.yml:

version: '3.7'

services:
   db:
     image: mysql:5.7
     volumes:
       - ./docker-mysql/db_data:/var/lib/mysql
     restart: always
     ports:
       - "3306:3306"
     env_file: .env

   wordpress:
     depends_on:
       - db
     image: progonkpa/mywordpress
     ports:
       - "80:80"
       - "443:443"
     restart: always
     volumes:
       - ./src:/var/www/html
     env_file: .env

volumes:
    db_data:

此配置有效,但只是因为我明确添加了 env_file 声明,而我认为如果我遵循正确的约定,Docker 会自动获取文件:根目录中的 .env 文件。

我实际上想删除 docker-compose.yml 中的 env_file 声明,但后来我遇到了一些问题。

MySQL 容器日志:

database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD

我似乎在初始化容器时第一次运行时,我与 mysql 相关的变量没有通过。.env 文件包含常用的 Wordpress 和 MySQL 变量:

MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress
MYSQL_ROOT_PASSWORD=wordpress
WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=wordpress

那么为什么我的变量没有到达我的容器呢?

标签: wordpressdockerdocker-composeenvironment-variables

解决方案


这里有两个地方可以使用变量:在 compose 文件本身内部,以及在docker-compose.

.env文件将用于docker-compose调整docker-compose命令本身的环境。这对于 yaml 文件中需要扩展的变量或 compose 本身使用的变量很有用。有关后者的更多信息,请参阅撰写 CLI 变量文档

在 yaml 内部定义一个env_file将从文件中获取环境变量并将它们注入到容器中。这使它对您的应用程序可见,但不能用于您想要docker-compose扩展的 yaml 中的变量,因为该变量扩展发生在env_file解析内容之前。


推荐阅读