docker-compose.yml 文件中,env_file 属性用于指定一个或多个环境变量文件,这些文件中的变量将会被加载到容器的环境中,供容器内的应用程序使用。env_file 文件通常是一个简单的文本文件,包含键值对格式的环境变量定义(如 .env 文件)。

env_file 语法

yaml
services: app: image: your_image env_file: - .env # 指定.env文件

常见用法

1. 使用 .env 文件

env_file 可以指定一个或多个 .env 文件,文件中的变量会自动加载到容器的环境中。

yaml
version: '3.8' services: app: image: your_image env_file: - .env # 加载当前目录下的 .env 文件

2. 指定多个 env_file 文件

你可以指定多个环境变量文件,Docker Compose 会按照顺序加载它们并覆盖重复的变量。

yaml
version: '3.8' services: app: image: your_image env_file: - .env - .env.production # 覆盖 .env 中的变量

3. 使用相对路径和绝对路径

你也可以指定环境变量文件的相对路径或绝对路径,来加载不同位置的 .env 文件。

yaml
version: '3.8' services: app: image: your_image env_file: - ./config/.env # 使用相对路径 - /path/to/env_file # 使用绝对路径

4. 在 .env 文件中定义变量

.env 文件通常包含一系列键值对,格式如下:

.env 文件示例:

env
DB_HOST=localhost DB_PORT=5432 DB_USER=myuser DB_PASSWORD=mypassword

这些变量会自动加载到容器的环境中,你可以在容器中通过 process.env(Node.js)或其他语言的环境变量方式访问它们。


env_file 和 environment 的区别

  • env_file: 从指定的文件加载环境变量(可以包含多个文件),并将变量导入容器。
  • environment: 可以直接在 docker-compose.yml 中定义环境变量。与 env_file 不同,environment 是直接定义在 docker-compose.yml 文件中的变量,而不是从外部文件加载。

示例:

yaml
version: '3.8' services: app: image: your_image environment: - DB_HOST=localhost - DB_PORT=5432

你可以使用 env_file 来加载 .env 文件,也可以直接使用 environment 来在 docker-compose.yml 文件中定义环境变量。

环境变量的优先级

当同时使用 env_fileenvironment 时,environment 中定义的变量优先于 env_file 中的变量。如果两个地方都有相同的环境变量,environment 中的值会覆盖 env_file 中的值。

问题排查

  • 容器没有读取到环境变量: 如果容器没有加载环境变量,确保 .env 文件位于 docker-compose.yml 同一目录下,且文件格式正确。
    • .env 文件中的每一行都应该是 KEY=VALUE 格式,不能有额外的空格或其他字符。
    • 使用 docker-compose exec <service_name> env 检查容器中是否正确加载了环境变量。

总结

  • env_file 用于加载外部环境变量文件(如 .env 文件)。
  • 可以指定多个环境文件,Docker Compose 会按顺序加载它们。
  • 使用 env_file 时,Docker Compose 会将文件中的变量加载到容器中,而 environment 用于直接在 docker-compose.yml 中定义变量。
  • environment 中的变量优先于 env_file 中的变量。

通过 env_fileenvironment 配合使用,可以灵活地管理和配置容器的环境变量

点赞(367) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部