为什么需要在 docker-compose.yml 中显式声明 env_file?

pro*_*kpa 23 wordpress environment-variables docker docker-compose

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

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

docker-wordpress
    Dockerfile
docker-compose.yml
.env

docker-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:
Run Code Online (Sandbox Code Playgroud)

此配置有效,但只是因为我显式添加了 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
Run Code Online (Sandbox Code Playgroud)

我似乎在第一次运行容器初始化时,与 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
Run Code Online (Sandbox Code Playgroud)

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

BMi*_*tch 40

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

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

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


Adi*_*iii 5

Docker-compose 需要显式定义所有内容,将其视为docker run parameter,它仅将这些配置或参数应用于 docker-compose 文件中定义的每个容器。

\n\n

因此,如果 ENV 已经在 Dockerfile 中声明,那么应该避免覆盖 ENV,这就是为什么您需要为自己显式定义这些配置。

\n\n

当我们构建 docker 时,我们在 docker-image 中设置了一些默认配置,但docker run commanddocker-compose提供了覆盖这些配置的功能,以便在映像作为容器启动时生效。

\n\n
\n

服务定义包含应用于为该服务启动的每个容器的配置,就像将命令行参数传递给 docker 容器创建一样。同样,网络和卷定义类似于 docker network create 和 dockervolume\n create。

\n
\n\n

撰写文件

\n\n

环境文件

\n\n

从文件添加环境变量。可以是单个值或列表。

\n\n
\n

如果您使用 指定了 Compose 文件docker-compose -f FILE,\n 中的路径env_file是相对于该文件所在目录的路径。

\n\n

环境部分中声明的环境变量会覆盖这些值\xe2\x80\x93,即使这些值为空或未定义,这也成立。

\n
\n\n
env_file: .env\n
Run Code Online (Sandbox Code Playgroud)\n