Docker Compose 修改 environment 或 env_file 后执行 restart 不生效,因环境变量在容器创建时写入元数据,restart 仅 stop+start 不重建容器;正确做法是用 docker compose up -d 实现配置更新。

修改 docker-compose.yaml 中的 environment 或 env_file 后执行 docker compose restart,配置不会生效——这不是你操作错了,是 Docker 的设计机制决定的。
restart 不会重新注入环境变量
Docker 容器的环境变量是在 docker create(即容器创建时)写死进容器元数据的,docker compose restart 只是调用 docker stop + docker start,不触发重建,也就不会重新解析 environment 字段。哪怕你在 YAML 里把 DEBUG=true 改成 DEBUG=false,重启后容器里 $DEBUG 还是原来的值。
- 验证方式:进容器执行
env | grep DEBUG,结果和上次启动时一致 - 真正生效的只有运行时可变参数,比如
docker update --restart=always - 如果你依赖
/etc/profile或.bashrc动态加载环境变量,那属于容器内进程自己的行为,和 Docker 的environment配置无关
docker compose up -d 才是正确更新姿势
docker compose up -d 会对比当前运行容器与 YAML 的差异,对有变更的服务自动执行 stop → remove → create → start 流程,这时新 environment 才会注入。
- 默认只重建“被修改”的服务,不影响其他服务
- 数据卷(
volumes)默认保留,不用担心数据库丢失 - 如果想强制重建(比如怀疑缓存导致配置没刷新),加
--force-recreate参数 - 注意:若镜像 tag 没变(如都用
:latest),Docker 不会自动拉新镜像,需手动docker compose pull
docker update 无法修改环境变量
docker update 命令支持调整 CPU、内存、重启策略等运行时参数,但明确不支持修改 Env、Cmd、PortBindings 等创建期字段。尝试执行会报错:
docker update --env NEW_VAR=value my-container Error response from daemon: Cannot update environment variables
- 这是 Docker 引擎层面的硬限制,不是权限或版本问题
- Mac 上有人尝试直接改
hostconfig.json和config.v2.json来绕过,但风险高:JSON 格式错一点就导致 daemon 启动失败,且重启 Docker Desktop 后可能被覆盖 - Windows/Linux 主机直跑 Docker 引擎的用户也一样受限,该限制跨平台统一
容易被忽略的配置校验环节
很多人改完 YAML 就急着 up,结果容器起不来,却不知道是语法或逻辑错误。最省事的检查方式是:
- 运行
docker compose config:输出最终解析后的完整配置,能立刻发现缩进错误、未闭合引号、变量引用缺失等问题 - 如果用了
${VAR}替换,确保 shell 环境已导出该变量,或.env文件存在且格式为KEY=VALUE(不能有空格) - 特别注意
env_file路径是相对于compose.yaml所在目录的,不是执行命令的当前目录


















