用.env文件批量注入环境变量是docker生产部署最推荐的做法,它将敏感信息和配置参数从命令行与编排文件中抽离,兼顾安全性与可管理性;需在项目根目录创建不提交至git的纯文本.env文件,按key=value格式书写,支持注释和空行,但不支持变量展开,通过docker run --env-file或docker-compose的env_file与environment协同加载,确保配置归位、职责分明。
用 .env 文件批量注入环境变量,是 docker 生产部署中最推荐的做法——它把敏感信息和配置参数从命令行和编排文件中抽离出来,既安全又便于管理。
准备一个标准的 .env 文件
在项目根目录创建名为 .env 的纯文本文件(注意:不提交到 Git),内容按 KEY=VALUE 格式书写,支持注释和空行:
# 生产数据库配置 DB_HOST=db-prod.internal DB_PORT=5432 DB_PASSWORD=7xK!q9#mL2 <h1>应用行为控制</h1><p>NODE_ENV=production API_TIMEOUT=5000 TZ=Asia/Shanghai</p>
注意:.env 文件本身不支持变量展开(比如不能写 HOME_DIR=$HOME),所有值必须是明确字符串。
在 docker run 中加载 .env 文件
启动容器时用 --env-file 参数指定该文件:
docker run --env-file .env my-app:latest
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
这样文件里所有变量都会作为环境变量注入容器内部。应用启动后可通过 printenv DB_HOST 或代码中读取 os.getenv("DB_HOST") 验证。
- 支持多次使用
--env-file加载多个文件(后加载的会覆盖同名变量) - 与
-e KEY=VALUE混用时,命令行参数优先级更高,可用来临时覆盖 - 文件权限需确保运行 Docker 命令的用户有读取权限
在 docker-compose.yml 中配合使用
Compose 支持两种协同方式:
-
env_file:用于变量插值或基础配置加载
例如在image: nginx:${NGINX_VERSION}中引用.env里的NGINX_VERSION,但这些变量默认不进容器 -
environment:决定哪些变量真正透传给容器
写成- DB_PASSWORD=${DB_PASSWORD}才会把.env中的值注入容器;若写成- DB_PASSWORD=123456就属于硬编码,应避免
典型组合写法:
version: '3.8'
services:
web:
image: my-web:${TAG:-latest}
env_file:
- .env
environment:
- NODE_ENV=${NODE_ENV}
- TZ=${TZ}
- LOG_LEVEL=info
关键注意事项
-
.env文件只被docker-compose和docker run --env-file识别,Dockerfile 中的ENV指令无法读取它 - 敏感变量(如密码、密钥)绝不要写死在
docker-compose.yml的environment区块里 - 变量名区分大小写,
DB_HOST和db_host是两个不同变量 - 如果变量值含空格或特殊字符,建议用单引号包裹,如
API_KEY='sk-abc def'
不复杂但容易忽略:只要文件存在、路径正确、语法干净,Docker 就能自动读取并注入——重点在于让配置归位、职责分明。










