"client version 1.32 is too old. Minimum supported API version is 1.40" on ubuntu-latest (Ubuntu 26.04): Docker 29 and Testcontainers
ubuntu-latest is moving from Ubuntu 24.04 to 26.04 between October 19 and November 19, 2026 (what else changes). The 26.04 image has Docker 29.4.2, whose daemon speaks API 1.54 and refuses anything below 1.40. The 24.04 image has Docker 28.0.4, which still accepted older clients. A client that negotiates the version with the daemon, such as the docker CLI, is not affected; a client that sends a fixed old version is refused.
Docker 29.0 raised the minimum to 1.44, and 29.3.0 lowered it to 1.40 (Docker 29 release notes). So the same message says 1.44 on a machine with Docker 29.0 to 29.2, and 1.40 on the runner.
The messages
The daemon's own answer, here to a test proxy that called /v1.32/ paths directly (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 hides it. Every test class that starts a container fails with a generic message, and the reason is only in Testcontainers' own log (elioo-health #169, 61 of 2179 tests failed):
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"}
Testcontainers before 1.21.4 sets the docker-java API version to 1.32 when none is configured. In thirdeye #1820 the first module with Testcontainers had 11 failures and 86 skipped tests, and the build stopped there, so none of the later modules ran.
Fix 1: Testcontainers 1.21.4 or 2.x
1.21.4 is the 1.x release made to work with the recent Docker Engine changes: it tries API 1.44 and falls back to 1.32. thirdeye went from 11 failures to 0 with a one-line version change and no code changes. 2.x has the fix too, but renames artifacts, for example mysql to testcontainers-mysql.
Check the version that actually runs, not only the one you declare. In elioo-health the modules declared 1.19.7, but the Spring Boot BOM pulled testcontainers and jdbc up to 1.20.4, so one test classpath held two versions. gradle dependencies or mvn dependency:tree shows the resolved version, and the first lines of Testcontainers' log print it (Testcontainers version: 1.20.4).
Fix 2: set the API version for docker-java
If you cannot upgrade yet, give docker-java a version the daemon accepts. Remote-Falcon #204 uses this locally on Docker 29: write api.version=1.44 to ~/.docker-java.properties, or pass -Dapi.version=1.44 to the test JVM.
- name: Pin the docker-java API version run: echo 'api.version=1.44' >> ~/.docker-java.properties
The DOCKER_API_VERSION variable does not help here, because docker-java does not read it.
Fix 3: lower the minimum on the runner's daemon
When the old client is inside a tool you do not control, let the daemon accept it. liberia-emr #341 needed this for a Maven plugin that starts Testcontainers 1.15, which always asks for API 1.30. Its step passed on ubuntu-26.04 20261025.179.1 and printed 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 is read by the daemon when it starts, so putting it in the job's env: changes nothing. The restart can stop containers that are already running, and the containers of a job's services: start before the first step. In a job with services:, prefer Fix 1 or 2.
Telling it apart
docker version --format '{{.Server.APIVersion}} {{.Server.MinAPIVersion}}'prints1.54 1.40on the 26.04 image.- In a job with
services:orcontainer:, the "Initialize containers" step logsDocker daemon API version: '1.54'on 26.04 and'1.48'on 24.04. - Look at "Set up job": the Runner Image group says
ubuntu-26.04orubuntu-24.04. Until November 19 a re-run can land on 24.04 and pass, so a green re-run proves nothing.runs-on: ubuntu-24.04holds until GitHub retires that image.
Other 26.04 failures
- rootless Podman on Ubuntu 26.04: the AppArmor profile of
pastarefuses Podman's SIGTERM, sodocker compose downover the Podman socket fails with "rootless netns: kill network process: permission denied". - kind load docker-image on Ubuntu 26.04: Docker 29's containerd image store keeps one platform of a pulled image, so kind's import fails with "ctr: content digest ... not found".
- Playwright on Ubuntu 26.04: Playwright 1.50 to 1.60 says it "does not support chromium on ubuntu26.04-x64".
- /etc/sysctl.conf on Ubuntu 26.04: inotify limits stay low, so .NET hosts and kind clusters hit "too many open files".
- "coreutils: unknown program": most core tools are uutils.
- apt on Ubuntu 26.04: renamed and removed packages.
See failed jobs from IntelliJ IDEA
Pipeline Inbox for GitHub Actions Workflows, a plugin by Lesstep for JetBrains IDEs 2024.1 or later, lists the runs of all your repositories in an IDE tool window, with their jobs and steps, and your current branch's runs are in the status bar. Reading is free; re-running failed jobs, cancelling, running workflows and reviewing deployments are Pro (US$1.50 a month, with a 30-day trial).
Get it on JetBrains Marketplace
GitHub and GitHub Actions are trademarks of GitHub, Inc.; Ubuntu is a trademark of Canonical Ltd.; Docker is a trademark of Docker, Inc.; Java is a registered trademark of Oracle and/or its affiliates; IntelliJ IDEA is a trademark of JetBrains s.r.o. This page is not affiliated with, sponsored or endorsed by GitHub, Inc., Canonical, Docker, Inc., Oracle or JetBrains.
More: "The ubuntu-latest label will migrate to Ubuntu 26" · kind load docker-image on Ubuntu 26.04 · Playwright on Ubuntu 26.04 · GitHub Actions plugins for IntelliJ IDEA compared · 日本語