更新Docker Compose重建镜像后容器未重启是什么原因?
问题根因
执行docker compose up --build时,Compose默认触发重建/重启容器的判定逻辑为:仅当容器不存在、或Compose配置(端口映射、挂载卷、环境变量、启动命令、资源限制等容器相关参数)与当前运行容器的参数不一致时,才会替换容器。
即使已经成功构建出新版本镜像,只要Compose判定运行中容器的配置和定义完全匹配,就不会主动停止旧容器、用新镜像重建,这也是日志末尾显示[+] Running 2/0、两个容器均保持Running状态的核心原因——计数里的0代表本次操作没有需要变更/重启的容器,新构建的镜像根本没被加载使用。
补充说明:--build参数的作用仅为「启动容器前先执行镜像构建流程」,本身不携带强制重启容器的逻辑。
可行解决方案
- 全量强制重建:在原有命令后加
--force-recreate参数,无论配置是否存在差异,都会强制停止旧容器、基于新镜像重建启动所有服务:
BUILDKIT_PROGRESS=plain docker compose --verbose -p bot -f docker-compose.yml -f docker-compose.dev.yml --env-file etc/db_env.conf up --detach --build --force-recreate
- 指定服务重建:如果不需要重启数据库等无变更的依赖服务,可在命令末尾指定目标服务名,仅重启对应应用容器:
BUILDKIT_PROGRESS=plain docker compose --verbose -p bot -f docker-compose.yml -f docker-compose.dev.yml --env-file etc/db_env.conf up --detach --build --force-recreate app
- 无状态两步操作:先删除旧的目标容器,再执行构建启动,避免旧容器状态残留导致的异常:
# 强制删除旧的应用容器 docker compose -p bot -f docker-compose.yml -f docker-compose.dev.yml --env-file etc/db_env.conf rm -fs app # 基于新镜像构建启动应用容器 BUILDKIT_PROGRESS=plain docker compose --verbose -p bot -f docker-compose.yml -f docker-compose.dev.yml --env-file etc/db_env.conf up --detach --build app
内容的提问来源于stack exchange,提问作者Eugen Konkov
相关产品推荐
相关产品推荐

