如何在 docker-compose 中重新构建容器?

docker compose build 服务名 重新构建镜像,docker compose up -d --build 执行构建并按镜像或配置变化决定是否重建容器;只想强制重建(不改代码)用 up -d --force-recreate。本文讲清各命令差别。

最佳实践
如何在 docker-compose 中重新构建容器?封面

核心命令:docker compose build <服务名> 重新构建该服务镜像,docker compose up -d --build 构建并替换运行中的容器。改了代码/Dockerfile 用前者组合;只改了 yml 配置用 up -d(自动检测重建);什么都没改但想重来用 --force-recreate。

按场景选命令

# 场景1:改了代码或 Dockerfile → 重新构建 + 更新容器
docker compose build web
docker compose up -d web

# 一步合并写法
docker compose up -d --build web

# 场景2:只改了 docker-compose.yml(环境变量、端口等)
docker compose up -d        # compose 自动检测配置变化并重建对应容器

# 场景3:啥都没改,想强制重建容器
docker compose up -d --force-recreate web

# 场景4:缓存可疑,从零构建
docker compose build --no-cache web # 不复用构建缓存;更新基础镜像还需按需--pull

build 和 up --build 的区别

  • docker compose build:只构建镜像,不动运行中的容器(新镜像下次 up 才用上)
  • docker compose up -d --build:调用构建(可能命中缓存),再按镜像/配置差异决定是否重建容器,一步到位
  • docker compose restart:不重建,只是停启现有容器——不能采用新构建镜像;若代码通过bind mount更新,重启现有进程可能重新加载它

重建时数据怎么办

  • 默认会重新挂载卷,但需核对实际卷名称/路径;不要用down -v等操作删除所需数据
  • 容器可写层丢失——重要数据必须已卷化

顺手清理

反复构建会积累旧镜像(悬空层):

docker image prune      # 清悬空镜像,不等于清理所有BuildKit构建缓存

重建后先确认运行的镜像版本,再用同一测试请求比较响应。若服务已接入观测云 APM,可在链路详情查看新版本的已采集请求,并结合日志中的版本标识排查差异;曲线变化只能提示相关性,还要对照具体错误和配置。

常见问题(FAQ)

Q:build 提示 uses an image, skipping?
A:若服务只有image而无build则没有构建定义,可pull更新;image与build也可同时存在,不能仅看到image就断言不能build。

Q:多服务项目能一次全构建吗?
A:docker compose build 不带服务名 = 构建全部带 build 配置的服务。

Q:--build 每次都很慢?
A:检查 Dockerfile 层缓存是否被失效(COPY . 放太早会把所有后续层缓存击穿),依赖安装层应与代码拷贝层分离。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台