Photo by Unsplash
384 字
2 分钟
Watchtower Docker API版本不匹配错误修复
Watchtower Docker API 版本不匹配错误修复
用 Watchtower 自动更新容器时遇到报错:
Error response from daemon: client version 1.25 is too old.Minimum supported API version is 1.44panic: runtime error: invalid memory address or nil pointer dereference问题原因
两个问题叠加:
- API 版本不匹配:主机的 Docker daemon 要求最低 API 版本 1.44,但 Watchtower 1.7.1 使用的是 1.25
- Watchtower Bug:遇到错误后没有优雅退出,而是尝试初始化 metrics 导致 nil pointer 崩溃
解决方案
方案一:更新 Watchtower 镜像(推荐)
本地缓存的镜像版本太旧,拉取最新版:
docker pull containrrr/watchtower:latest然后重新运行:
docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower \ --cleanup \ --run-once方案二:强制指定 API 版本
如果必须用旧版 Watchtower,通过环境变量强制使用新 API:
docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ -e DOCKER_API_VERSION=1.44 \ containrrr/watchtower \ --cleanup \ --run-once检查 Docker 版本
确认主机 Docker 版本和 API 版本:
# Docker 版本docker version
# Docker 信息docker info | grep "API version"输出示例:
Client: API version: 1.44 Go version: go1.21.6
Server: API version: 1.44 Go version: go1.21.6Watchtower 常用命令
# 一次性检查更新(手动运行)docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower \ --cleanup \ --run-once
# 持续监控(后台运行)docker run -d \ --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower \ --cleanup \ --interval 3600 # 每小时检查一次
# 仅更新指定容器docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower \ --cleanup \ --run-once \ nginx mysql redis忽略某些容器
如果不想自动更新某个容器,添加标签:
version: '3'services: myapp: image: myapp:latest labels: - "com.centurylinklabs.watchtower.enable=false"参考链接
- Watchtower 文档:https://containrrr.dev/watchtower/
- Docker API 版本:https://docs.docker.com/engine/api/
Watchtower Docker API版本不匹配错误修复
https://im.awsl.app/posts/system-ops/042-watchtower-api-fix/