Lesstep
GitHub Actions・Ubuntu 26.04・2026年11月4日に確認

ubuntu-latest(Ubuntu 26.04)の「client version 1.32 is too old. Minimum supported API version is 1.40」:Docker 29 と Testcontainers

ubuntu-latest は、2026年10月19日から11月19日にかけて Ubuntu 24.04 から 26.04 に移ります(ほかに変わること)。26.04 のイメージの Docker は 29.4.2 で、デーモンは API 1.54 を話し、1.40 より古いものを断ります。24.04 のイメージの Docker 28.0.4 は、古いクライアントもまだ受け付けていました。docker の CLI のように、デーモンとバージョンを決め合うクライアントは影響を受けません。古いバージョンを決め打ちで送るクライアントが断られます。

Docker 29.0 で下限は 1.44 に上がり、29.3.0 で 1.40 に下がりました(Docker 29 のリリースノート)。そのため同じメッセージでも、Docker 29.0〜29.2 のマシンでは 1.44、ランナーでは 1.40 と出ます。

メッセージ

デーモン自身の答えです。ここでは /v1.32/ のパスを直接呼んでいたテスト用のプロキシに返されました(twilio-voice.js #492):

client version 1.32 is too old. Minimum supported API version is 1.40, please upgrade your client to a newer version

Testcontainers for Java はこれを隠します。コンテナを始めるテストのクラスがすべて一般的なメッセージで落ち、理由は Testcontainers 自身のログにしかありません(elioo-health #169・2179 件中 61 件が失敗):

java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration
...
UnixSocketClientProviderStrategy: failed with exception BadRequestException (Status 400: {"message":"client version 1.32 is too old. Minimum supported API version is 1.40, please upgrade your client to a newer version"}

1.21.4 より前の Testcontainers は、何も設定が無いと docker-java の API のバージョンを 1.32 にします。thirdeye #1820 では、Testcontainers を使う最初のモジュールで 11 件が失敗、86 件が飛ばされ、ビルドがそこで止まったので、あとのモジュールは1つも動きませんでした。

直し方1:Testcontainers 1.21.4 か 2.x

1.21.4 は、最近の Docker Engine の変更に合わせて出た 1.x の版です。API 1.44 を試し、だめなら 1.32 に戻ります。thirdeye は1行のバージョンの変更だけで、コードを変えずに失敗が 11 件から 0 件になりました。2.x にも直しは入っていますが、アーティファクトの名前が変わります(たとえば mysql は testcontainers-mysql)。

書いたバージョンだけでなく、実際に動くバージョンを確かめます。elioo-health ではモジュールに 1.19.7 と書いていましたが、Spring Boot の BOM が testcontainers と jdbc を 1.20.4 に上げていて、1つのテストのクラスパスに2つのバージョンがありました。解決されたバージョンは gradle dependencies か mvn dependency:tree でわかり、Testcontainers のログの最初の行にも出ます(Testcontainers version: 1.20.4)。

直し方2:docker-java の API のバージョンを決めておく

まだ上げられないなら、デーモンが受け付けるバージョンを docker-java に渡します。Remote-Falcon #204 は、手元の Docker 29 でこうしています。~/.docker-java.properties に api.version=1.44 と書くか、テストの JVM に -Dapi.version=1.44 を渡します。

- name: Pin the docker-java API version
  run: echo 'api.version=1.44' >> ~/.docker-java.properties

docker-java は DOCKER_API_VERSION の変数を読まないので、こちらは効きません。

直し方3:ランナーのデーモンの下限を下げる

古いクライアントが自分では変えられないツールの中にあるなら、デーモンの側で受け付けます。liberia-emr #341 は、Testcontainers 1.15 を始める Maven のプラグインのためにこれが必要でした。このプラグインはいつも API 1.30 を求めます。そのステップは ubuntu-26.04 20261025.179.1 で通り、Docker 29.4.2, min API 1.24 と出しました:

- name: Allow older Docker API versions
  run: |
    sudo mkdir -p /etc/systemd/system/docker.service.d
    printf '[Service]\nEnvironment=DOCKER_MIN_API_VERSION=1.24\n' \
      | sudo tee /etc/systemd/system/docker.service.d/min-api-version.conf
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    docker version --format 'Docker {{.Server.Version}}, min API {{.Server.MinAPIVersion}}'

DOCKER_MIN_API_VERSION はデーモンが起動するときに読むので、ジョブの env: に書いても何も変わりません。再起動は動いているコンテナを止めることがあり、ジョブの services: のコンテナは最初のステップより前に始まります。services: のあるジョブでは、直し方1か2を選びます。

見分け方

26.04 のほかの失敗

失敗したジョブを IntelliJ IDEA から見るなら

Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。

JetBrains Marketplace で入れる

GitHub と GitHub Actions は GitHub, Inc. の商標、Ubuntu は Canonical Ltd. の商標、Docker は Docker, Inc. の商標、Java は Oracle とその関連会社の登録商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Canonical・Docker, Inc.・Oracle・JetBrains のいずれとも提携しておらず、承認も受けていません。

ほかに:「The ubuntu-latest label will migrate to Ubuntu 26」 · Ubuntu 26.04 の kind load docker-image · Ubuntu 26.04 の Playwright · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English