結論:このエラーは、Dockerデーモンへ接続したクライアント側のAPIが古いために起きます。Docker本体だけを更新するのではなく、Watchtowerなどソケットへ接続するコンテナのイメージと起動設定を確認し、デーモンが受け付けるAPI世代に揃えてください。まずは次のコマンドで、ホスト側の前提を記録します。
docker --version && docker compose version
自ラボの既存ログでは、Docker 29.6.0/Docker Compose v5.2.0の環境でWatchtowerを実行した直後に、client version 1.25と最小対応1.40の不一致で拒否されました。更新対象の確認より前に止まるため、ラベル設定やイメージ更新の有無を見直しても、この不一致自体は解消しません。
最短の切り分け手順
- エラーを出した実行主体を特定します。端末でdockerコマンドを打った場合と、WatchtowerのようなコンテナがDockerソケットへ接続した場合では、見直す対象が異なります。
- ホスト側のバージョンを確認します。
docker --version && docker compose version - Watchtowerの場合は、実行中コンテナのイメージ、Compose定義、固定しているタグを確認します。古いイメージや古い固定タグを使っているなら、API互換を満たす版へ更新する判断が必要です。
- 変更後は、同じ実行経路で再実行し、API拒否の行が消えたことを確認します。自動更新を有効にするのは、その後です。
この既存検証では、Watchtower 1.7.1がAPI不一致の後にpanicして終了コード2となりました。互換性を揃える修正そのものはこの検証では実施していないため、特定のWatchtower版・更新コマンドがこの環境で有効だったとは断定しません。利用中のイメージタグと配布元の対応状況は要確認です。
何を確認すればよいか
| 確認対象 | 実行コマンド | 判断できること | この実測で分かる範囲 |
|---|---|---|---|
| ホストのDocker | docker --version |
デーモン側の前提記録 | 29.6.0で発生 |
| Compose | docker compose version |
起動経路の前提記録 | v5.2.0で発生 |
| Watchtowerのログ | 実行ログを確認 | 接続時点で拒否されたか | 1.25と1.40の不一致を確認 |
| 更新処理 | 互換性確認後に再実行 | 更新対象の探索へ進めるか | 不一致中は未到達 |
自動更新は、互換性確認の前に有効化しない方が安全です。既存検証では壊れたlatestをpushしても、Watchtowerが接続段階で停止したため、稼働中コンテナは更新されませんでした。更新前のタグやdigestを残し、手動で戻せる状態を保つ手順はコンテナを安全に更新・公開する方法も参照してください。
よくある質問
Watchtowerでも同じエラーが出ますか?
出ます。既存検証ではWatchtower実行時に同じエラーが出ました。WatchtowerがDockerデーモンへ接続するクライアントとして、古いAPIを使ったことが原因です。
docker-composeだけ更新すればよいですか?
必ずしも解決しません。エラーを出した主体がWatchtowerなら、Compose本体ではなくWatchtowerコンテナのイメージや固定タグを確認します。まず、どのプロセスがエラーを出したかをログで切り分けてください。
APIバージョンをどう確認しますか?
最初にdocker --version && docker compose versionでホスト側の前提を残し、続いてエラーを出したコンテナのログを確認します。ログ内のclient versionとMinimum supported API versionが、今回の直接の判断材料です。
関連して、Watchtowerで止まった検証ログ、Dockerコンテナの停止と切り戻しの検証も参照できます。
この検証を回している環境
この検証は、自宅の常設ラボ(使い捨てVM/LXCを回す母艦+GPU+VLAN分離ネットワーク)で動かしています。使っている機材と選定理由、全体構成は1本にまとめています。
ラボ構成のまとめを見る →