如何在 docker-compose 中重新构建容器?
docker compose build 服务名 重新构建镜像,docker compose up -d --build 执行构建并按镜像或配置变化决定是否重建容器;只想强制重建(不改代码)用 up -d --force-recreate。本文讲清各命令差别。
核心命令: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 . 放太早会把所有后续层缓存击穿),依赖安装层应与代码拷贝层分离。