一、--force-recreate
作用
- 强制重新创建指定的服务,即使服务的配置未发生任何变化。
- 忽略现有容器的状态,无论容器是停止、运行还是有无变化,都会销毁并重新创建。
用法
docker compose up -d --force-recreate [services...]
- 不指定服务:对配置文件中的所有服务生效。
- 指定服务:仅对指定的服务生效。
常用场景
docker compose up -d --force-recreate
- 更新镜像后重建:当服务镜像更新(如新版本推送)时,强制重新创建以应用最新镜像。
- 修复错误状态的容器:当容器状态异常(如配置未变但容器行为不正常)时,强制重建容器恢复正常。
注意事项
- 会销毁现有容器,因此容器中的非持久化数据会丢失。
- 与服务未变化无关,强制生效,可能会增加不必要的重建时间。
二、--no-recreate
作用
- 防止重新创建已存在的容器。
- 如果容器已经存在且处于任何状态(停止或运行),Docker Compose 会跳过创建,直接启动该容器。
用法
docker compose up -d --no-recreate [services...]
- 不指定服务:对配置文件中的所有服务生效。
- 指定服务:仅对指定的服务生效。
常用场景
docker compose up -d --no-recreate
- 跳过已有容器:不改变已存在的服务容器,仅启动未运行的服务。
- 防止干扰运行中的服务:确保运行中的服务不被重新创建,以保持服务稳定性。
注意事项
- 如果容器不存在,则会创建新的容器。
- 无法更新已有容器,即使镜像发生变化也不会重建。
三、区别
特性 | --force-recreate |
--no-recreate |
---|---|---|
强制重建 | 是 | 否 |
作用范围 | 配置中的所有或指定服务 | 配置中的所有或指定服务 |
处理已存在容器 | 无条件重建(即使未改变) | 跳过(即使配置已改变) |
新增容器 | 创建并强制覆盖 | 创建但不覆盖 |
四、配合使用
目的
通过组合 --force-recreate
和 --no-recreate
,实现对服务的精细化控制,例如对部分服务强制重建,对其他服务保持不变。
常用场景
1. 避免干扰特定服务
-
只重建部分服务,其他服务保持不变:
docker compose up -d --no-recreate service-A
docker compose up -d --force-recreate -
效果 :
service-A
不被重建。- 配置中的其他服务强制重建。
2. 控制重建顺序
-
先确保某服务不被重建,随后对其他服务强制重建:
docker compose up -d --no-recreate service-B
docker compose up -d --force-recreate -
效果 :
service-B
不会重建,但仍会启动(若未运行)。- 配置中的其他服务被强制重建。
五、注意事项
-
范围冲突:
- 如果同时指定服务和不指定服务,可能出现覆盖范围冲突。应避免混淆参数使用。
- 示例 :以下命令中,
my-service
仍会被重建,因为--force-recreate
优先生效:
docker compose up -d --no-recreate my-service
docker compose up -d --force-recreate -
数据丢失:
- 使用
--force-recreate
时,非持久化数据会丢失,因此确保重要数据已经挂载为持久存储。
- 使用
-
资源消耗:
- 强制重建可能带来额外的系统资源消耗,尤其是在大量服务或镜像拉取的情况下。
-
服务依赖关系:
- 如果某些服务存在依赖关系(如数据库),应确保关键服务(如数据库)不被强制重建,以免造成服务中断。
六、总结
--force-recreate
:用于强制重建所有或指定的服务,无论状态如何。适合需要重建更新或修复错误的场景。--no-recreate
:用于避免对已有服务的干扰,仅启动未运行的服务。适合保持服务稳定的场景。- 组合使用:通过分步执行,可以实现对服务的精细控制,适用于复杂多服务的场景。
七、以上总结来源于讨论,过程记录如下:
Docker compose 使用 --force-recreate --no-recreate 控制重启容器时的行为【后续】