docker-compose.yml .env用法

1.容器内加载source .env

满足几个条件:

  • .env 文件必须存在于容器内
  • COPY 进镜像
  • 或通过 volume 挂载

方式A:构建时复制进镜像

1
COPY .env /app/.env

方式B:运行时挂载

1
2
3
4
services:
app:
volumes:
- ./.env:/app/.env

entrypoint.sh 推荐写法

直接 source .env 容易因格式问题失败,推荐:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env bash
set -e

if [ -f /app/.env ]; then
set -a
source /app/.env
set +a
fi

exec "$@"

关键点:

  • set -a 自动 export 变量
  • 容器内所有进程都能读取
  • exec "$@" 保证信号传递正常(容器优雅退出)

2.env写法

.env 最好只保留:

KEY=value

compose .env 与容器 .env 读取阶段

  • compose 读取 .env 是在 宿主机阶段
  • entrypoint 读取 .env 是在 容器阶段

二者不是同一个生命周期。

3.加载.env

3.1用于docker-compose.yml变量替换

docker-compose up -d

自动读取当前目录下.env 用于替换 x=${y}

3.2容器内export作为系统变量

env_file:
  - ./.env