Docker 升级后 Traefik 报 client version 1.24 is too old,路由不再更新
Docker 服务端与 Traefik 内部客户端 API 不兼容,会阻断服务发现。核对实际 API 范围,升级支持协商的代理,再验证已有及新增路由。
Docker 升级后 Traefik 报 client version 1.24 is too old,路由不再更新
宿主机 Docker 升级后,docker ps 正常,Traefik 容器也还在运行,但新部署的服务没有路由,日志不断出现 client version 1.24 is too old。这时先看后半句:Minimum supported API version is 1.44。它指出的是 Traefik 内部 Docker 客户端与守护进程的协议不兼容,容器存活并不代表 Docker provider 能读取容器标签。
Docker Engine 29.0.0 把最低 API 版本提高到 1.44。旧 Traefik 的 Docker provider 使用较低版本,连接被拒后,自然无法继续发现服务。这个边界后来发生过变化:Docker 29.3.0 又把最低版本降到 1.40,因此排查当前机器时要读取实际输出,不能只凭“Docker 29”判断。
在宿主机检查:
docker version
docker compose logs --tail=100 traefik
docker inspect --format '{{.Config.Image}}' traefik
这里的 traefik 应替换成实际服务名或容器名。docker version 的 Client 是命令行客户端,不能证明 Traefik 镜像中的客户端也支持相同协议。重点核对 Server 的 API 范围和 Traefik 日志中的拒绝版本。
换到会协商 API 的 Traefik
Traefik 3.6.1 已包含 Docker API 自动协商修复。如果项目使用较早的 3.x 镜像,可以在完成相应迁移检查后升级到包含该修复的版本。下面的 3.6.2 是一个已确认可用于该问题的版本示例,实际生产应选项目维护中的兼容版本并固定标签或摘要:
services:
traefik:
image: traefik:v3.6.2
保留原来的 command、端口、网络、证书存储和 Docker socket 挂载。然后只重建代理服务:
docker compose pull traefik
docker compose up -d --no-deps traefik
docker compose logs --since=2m traefik
如果跨越多个 Traefik 次版本,还需要检查配置迁移,尤其是项目原来启用的 provider。Swarm 环境也应单独确认 Swarm provider 的配置与支持范围,不能把普通 Docker 的成功结果直接当成 Swarm 验收。
不要把 DOCKER_API_VERSION=1.44 当成通用修复。环境变量是否被客户端读取、代码是否覆盖它、固定协议能否匹配所有宿主机,都取决于客户端实现;升级到支持协商的版本更容易维护。降低守护进程最低 API 只改变服务端接受范围,还会影响同机其他客户端,不宜作为日常长期配置。
验证时至少选一个已有路由和一个新部署路由。确认日志不再出现 API 拒绝,已有站点正常响应,再修改测试服务的一条标签并重建该服务,检查新路由是否出现。只访问一个缓存中的旧路由,无法证明 Docker provider 已恢复。如果协议错误已消失却仍然 404,再查标签、入口和网络选择,那属于下一层故障。


