docker compose config | grep DB_HOST
docker compose up -d --force-recreate app
docker compose exec app env | grep DB_HOST

.env 里把 DB_HOST 改了,up -d 之后进容器 env 查还是旧值,重启单个服务也没有变化,日志里连的还是老地址,只有删掉容器才生效。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,compose 只在容器创建那一刻注入环境变量,配置变了但容器没重建,up 判定无变更就直接复用旧容器,很多人以为是缓存,其实必须重建。

围绕「compose 环境变量未生效」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

处理上按这个顺序:先确认改的是 compose 实际加载的那一个 env 文件 别改错目录;执行 up -d 的时候加上 --force-recreate 参数把容器强制重建一遍 别只 restart;把 shell 和 env_file 的优先级排一遍 别被外层同名变量覆盖 否则改了也白改。

改完只确认一件事:容器内 env 输出和文件里的值一致,应用连到了新地址,重启容器值保持。

作者 9823189