docker环境变量配置需分三层:用arg传构建时参数(不固化镜像)、env设运行时默认值、-e或--env-file在运行时覆盖;敏感信息禁用env明文存储,推荐多阶段构建与.env文件管理。
在 dockerfile 中配置环境变量,关键不是“写死”所有值,而是为不同环境留出灵活替换的空间。核心思路是:用 env 设默认值 + arg 做构建时传参 + 运行时覆盖,三层配合才能真正适配开发、测试、生产等场景。
用 ENV 设置合理默认值
ENV 指令定义的变量会固化进镜像,对所有环境生效,适合设通用、安全、非敏感的默认配置:
- 比如
ENV NODE_ENV=development或ENV APP_HOME=/app,便于后续指令复用(如WORKDIR $APP_HOME) - 避免在 ENV 中写密码、密钥、生产数据库地址等敏感信息
- 多个变量建议写成单行形式:
ENV TZ=UTC LANG=C.UTF-8 APP_PORT=8080,减少镜像层数
用 ARG 实现构建阶段动态注入
ARG 变量只在构建期间有效,不会留在最终镜像里,适合传入代理、版本号、临时配置等:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 在 Dockerfile 开头声明:
ARG HTTP_PROXY HTTPS_PROXY - 再通过 ENV 赋值使其进入运行时:
ENV http_proxy=$HTTP_PROXY https_proxy=$HTTPS_PROXY - 构建时传参:
docker build --build-arg HTTP_PROXY=http://10.0.1.10:8080 -t myapp . - 这样既不泄露代理地址到镜像,又能保证 apt/npm/curl 等命令正常工作
预留运行时覆盖能力
Dockerfile 中的 ENV 是“默认值”,不是“锁定值”。启动容器时可用 -e 或 --env-file 直接覆盖:
- 例如 Dockerfile 有
ENV DB_HOST=localhost,运行时加-e DB_HOST=prod-db.internal就自动生效 - 生产环境推荐用
--env-file .env.production批量加载,文件内容如:DB_HOST=prod-db.internal<br>LOG_LEVEL=warn<br>API_TIMEOUT=3000
- 注意:命令行
-e优先级高于--env-file,而两者都高于 Dockerfile 的 ENV
结合 Docker Compose 统一管理多环境
在 docker-compose.yml 中,environment 字段可引用宿主机环境变量或 .env 文件变量:
- 直接写值:
environment: - DB_HOST=${DB_HOST:-localhost},其中${DB_HOST:-localhost}表示若宿主机没设 DB_HOST,则用 localhost - 搭配项目根目录下的
.env文件(该文件不提交 Git),自动加载作为 compose 的上下文变量 - 不同环境用不同文件:
docker-compose --env-file .env.staging up,让同一份 docker-compose.yml 适配多套配置










