daemon.json 不支持设置默认容器环境变量,因其仅配置守护进程行为,不参与容器运行时上下文构建;容器环境变量必须在启动时通过 docker run -e、docker-compose.yml 或 Dockerfile ENV 显式指定。
daemon.json 本身不支持设置默认容器环境变量。
为什么不能在 daemon.json 里设环境变量
Docker 守护进程(dockerd)的配置文件 daemon.json 控制的是守护进程自身行为,比如存储路径、镜像源、日志策略、网络参数等。它不参与容器启动时的运行时上下文构建,因此没有 env、environment 或 default-env 这类字段。容器级的环境变量必须由用户在创建容器时显式指定——通过 docker run -e、docker-compose.yml 的 environment 或 env_file,或构建镜像时用 ENV 指令固化。
替代方案:统一注入环境变量的可行方式
虽然 daemon.json 不行,但有几种实用方法可实现“默认”效果:
-
用 shell 别名或 wrapper 脚本封装 docker run:例如在
~/.bashrc中定义alias drun='docker run -e TZ=Asia/Shanghai -e LANG=C.UTF-8',让日常命令自动携带常用变量 -
在 docker-compose.yml 中设 defaults(推荐):通过
x-defaults自定义片段 +&defaults引用,或直接在services顶层用environment批量声明,适用于项目级标准化 -
构建基础镜像时预置 ENV:在公司/团队共用的基础镜像 Dockerfile 中写入
ENV NODE_ENV=production TZ=Asia/Shanghai,所有基于它的容器天然继承 - 使用容器运行时插件或外部编排工具:如 Kubernetes 的 Pod template、Nomad job 文件,或自研 CI/CD 流水线,在调度层统一注入
注意 daemon.json 中容易混淆的相关项
以下字段看似相关,但和容器环境变量无关:
-
default-runtime:指定默认 OCI 运行时(如 runc / crun),不传递变量 -
default-ulimits:设置默认资源限制(如 nofile),非环境变量 -
dns/dns-search:影响容器内 DNS 解析行为,不是ENV -
env字段在 daemon.json 中不存在,任何尝试添加都会导致 JSON 解析失败、dockerd 启动失败
想让每个容器都带某些环境变量,就得在容器启动那一刻决定——daemon.json 不是那个环节的配置入口。


















