Docker Swarm 清理历史任务记录


Docker Swarm 清理历史任务记录

问题描述

Swarm 模式下,服务更新或容器重启后,docker service ps <service> 中会积累大量 Shutdown 状态的历史任务记录。这些记录会占用磁盘空间,大量堆积甚至可能导致集群异常。

核心结论

不需要删除服务,只需调整全局集群配置或手动清理。

⚠️ 常见误区

错误命令 原因 正确命令
docker service update --task-history-limit 1 service 命令没有这个参数 docker swarm update --task-history-limit 1
docker service rm <service> 会导致服务停机,数据/配置丢失 不要用
docker rm $(docker ps -aq) 会删除运行中的容器,导致服务崩溃 docker container prune

方案一:设置全局清理策略(推荐,一劳永逸)

Manager 节点 执行:

1
2
# 设置全局历史任务保留数为 1(默认是 5,设为 1 只保留最新记录)
docker swarm update --task-history-limit 1

执行后,docker service ps <service> 中旧的 Shutdown 记录会随新更新自动清理。

验证当前设置:

1
docker info | grep "Task History"

方案二:手动强制清理(一次性解决)

1
2
3
4
5
6
7
8
# 1. 清理所有节点上的已停止容器(释放磁盘空间)
for node in $(docker node ls --format "{{.Hostname}}"); do
echo "清理节点 $node ..."
ssh $node "docker container prune -f"
done

# 2. 强制重启服务,触发 Swarm 清理旧的任务元数据
docker service update --force <service_name>

注意事项

  • task-history-limit 对配置了 restart-max-attempts 的服务可能不生效(GitHub Issue #35637
  • 大量历史任务堆积可能导致 Manager 节点内存耗尽、集群不可用
  • 建议将 task-history-limit 设为 1~2,根据排查需求调整

参考


文章作者: 保健
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 保健 !
  目录