docker-compose.yml直接读取变量或者基于文件读取.env

1.基于.env在docker-compose.yml读取变量(变量替换)

在 Docker Compose 中,docker-compose.yml 可以直接读取 .env 文件里的环境变量,用于服务配置、端口、镜像标签等。

1.1 默认行为

  • 如果 .env 文件放在 docker-compose.yml 同一目录下,Compose 会自动读取其中的变量。
  • .env 文件格式:
# .env
MYSQL_ROOT_PASSWORD=root123
MYSQL_DATABASE=mydb
APP_PORT=5000
  • docker-compose.yml 中引用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: "3.9"

services:
app:
image: myapp:${APP_TAG:-latest} # 可用默认值
ports:
- "${APP_PORT}:5000"
environment:
- DB_PASSWORD=${MYSQL_ROOT_PASSWORD}
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}

注意:

  • ${VAR} 表示读取 .env 文件里的变量。
  • 可以写默认值 ${VAR:-default}

可以用 .env 文件定义镜像名、端口等 Compose 文件中的占位符。

1
2
3
4
5
6
7
version: "3.9"

services:
web:
image: "${WEB_IMAGE}:${WEB_TAG}"
ports:
- "${WEB_PORT}:80"

.env

WEB_IMAGE=mywebapp
WEB_TAG=1.2.3
WEB_PORT=8080

启动:

1
docker-compose up -d
  • Compose 会自动替换 ${WEB_IMAGE}, ${WEB_TAG}, ${WEB_PORT}

1.2. 指定其他 .env 文件

如果 .env 文件不在 docker-compose.yml 同目录,可以用 --env-file 参数:

1
docker-compose --env-file ./config/myenv.env up -d

2. env变量注入到系统环境变量中

完全可以,把.env 文件里的变量不仅可以被 docker-compose.yml 用来替换配置,还可以注入到容器内部作为环境变量。关键在于 environmentenv_file 配置。


2.1. 直接在 environment 注入

1
2
3
4
5
6
7
8
9
10
version: "3.9"

services:
app:
image: myapp:latest
ports:
- "${APP_PORT}:5000"
environment:
- DB_PASSWORD=${MYSQL_ROOT_PASSWORD} # 从 .env 读取
- APP_ENV=${APP_ENV:-production} # 可以有默认值
  • 容器启动后可以通过 echo $DB_PASSWORD 在容器内访问。
  • ${VAR} 会从 .env 文件中解析。

2.2. 使用 env_file

如果 .env 文件中很多变量想直接注入到容器,可以用 env_file

1
2
3
4
5
6
7
8
9
version: "3.9"

services:
app:
image: myapp:latest
ports:
- "5000:5000"
env_file:
- .env # 整个文件的变量都会进入容器环境
  • 容器内部所有 .env 中的变量都会作为环境变量。
  • 如果同时使用 environmentenv_fileenvironment 中的值会覆盖 env_file

2.3. 容器内部访问验证

1
2
3
docker exec -it <container_name> /bin/sh
echo $DB_PASSWORD
echo $APP_ENV
  • 可以在启动脚本中直接使用这些环境变量配置应用。

3. 注意事项

  1. .env 中不要加空格:

    VAR=value   # 正确
    VAR = value # 错误,会被当作字符串
    
  2. .env 中不要引用其他变量。

  3. Docker Compose 版本 >= 1.28 支持 .env 中的默认值替换。