Docker Engine 29:最低 API 版本抬到 v1.44,读取 /events 的脚本需要修改字段名
29.0.0 的定位
29.0.0 于 2025-11-10 发布。daemon 实测支持 nftables(firewall-backend=nftables);containerd image store 成为全新安装的默认存储(配置了 userns-remap 的 daemon 除外,moby#47377);版本包含多项 breaking changes 与弃用项。
最低 API 版本抬到 v1.44
daemon 现在要求 API 版本 v1.44 或更高,对应 Docker v25.0+(moby#51186)。客户端侧也同步移除了对 < v1.44 的版本协商(moby#51119),因此不会存在“降级协商到旧版本”的自动兼容处理。
这条改动主要影响以下几类客户端:
- 自研客户端在 URL 中固定写入具体版本号,例如直接请求
/v1.43/containers/json; - 依赖旧版 SDK、而该 SDK 内部仍按低于 v1.44 的版本发起请求;
- 启动时先读取一次
/version取得ApiVersion并缓存,之后长期复用该值的脚本。
哪些 SDK 版本已经开始请求 v1.44,release note 没有逐条列出,需要按自己锁定的 SDK 版本自行验证。
低于 v1.44 的请求会被 daemon 拒绝。具体的 HTTP 状态码与错误文本未在信源中给出,需要拿实际客户端请求一次确认,不要按记忆中的报错字符串写进监控规则。
怎么查当前客户端 API 版本
常规做法是执行 docker version,输出里分别有 Client 与 Server 的 API version 字段;不看 CLI 的话,直接请求 unix socket 的 /version,读返回 JSON 里的 ApiVersion:
curl -s --unix-socket /var/run/docker.sock http://localhost/version | jq .ApiVersion
字段名以实际输出为准。若要把工具升级到基线上,目标就是让这个值 ≥ 1.44。
/events 不再返回 status、id、from
这三个字段在 API v1.22 就已弃用,但一直保留在响应里;现在使用 API v1.52 或更高时会省略(moby#50832)。仍在读取这三个字段的事件消费脚本会拿到空值。
替代方式是使用事件对象上的 Type、Action、Actor。改造前后的对应关系:
| 旧字段 | 新取法 |
|---|---|
id | Actor.ID |
status | Action |
from | Actor.Attributes 中的镜像信息 |
CLI 侧格式化输出示例:
# 旧
docker events --format '{{.ID}} {{.Status}} {{.From}}'
# 新
docker events --format '{{.Actor.ID}} {{.Type}} {{.Action}}'
直接消费 /events 流时,用 jq 取字段:
curl -s --unix-socket /var/run/docker.sock http://localhost/events \
| jq -c '{type, action, id: .Actor.ID, attrs: .Actor.Attributes}'
注意 Action 是字符串(如 start、die),而 status 在旧版里有时带附加信息(如 exec_start: sh),拼接逻辑需要重新对齐。上述模板字段名请以本机 docker events --help 与实际返回 JSON 为准。
同版本内其他 API 移除项
api/types/network:CreateRequest移除CheckDuplicate字段。api/types/system:移除DiskUsage.BuilderSize。- 引擎此前会为空
PortBindings列表回填一个空HostIP、HostPort的PortBinding,该行为在 API 1.52 弃用,1.53 去掉(moby#50874)。 client:移除ImageBuildResponse.OSType、ImageListOptions.ContainerCount。api/types/image:InspectResponse移除VirtualSize、Container、ContainerConfig、Parent、DockerVersion。- 移除
NetworkSettingsBase、DefaultNetworkSettings结构体,未弃用的字段并入NetworkSettings。 POST /images/{name}/push移除了对 API v1.4auth-config的兼容(moby#50371)。
另外两项与代码集成方式有关:Go 模块 github.com/docker/docker 弃用,改用 github.com/moby/moby/client 与 github.com/moby/moby/api,github.com/moby/moby 视为内部实现细节;从 v29 起 release tag 带 docker- 前缀(docker-v29.0.0)。