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.44
panic: runtime error: invalid memory address or nil pointer dereference

问题原因#

两个问题叠加:

  1. API 版本不匹配:主机的 Docker daemon 要求最低 API 版本 1.44,但 Watchtower 1.7.1 使用的是 1.25
  2. Watchtower Bug:遇到错误后没有优雅退出,而是尝试初始化 metrics 导致 nil pointer 崩溃

解决方案#

方案一:更新 Watchtower 镜像(推荐)#

本地缓存的镜像版本太旧,拉取最新版:

Terminal window
docker pull containrrr/watchtower:latest

然后重新运行:

Terminal window
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
--run-once

方案二:强制指定 API 版本#

如果必须用旧版 Watchtower,通过环境变量强制使用新 API:

Terminal window
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 版本:

Terminal window
# 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.6

Watchtower 常用命令#

Terminal window
# 一次性检查更新(手动运行)
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 Docker API版本不匹配错误修复
https://im.awsl.app/posts/system-ops/042-watchtower-api-fix/
作者
uu
发布于
2025-10-08
许可协议
CC0 1.0