Skip to content
Corentin GS

Docker 29 + Traefik: Fix “Client Version 1.24 Is Too Old”

№17 · · ·Updated ·1004 words ·5 min read
In this piece

Traefik cannot discover containers if Docker rejects the API version it requests. After a Docker 29 upgrade, the provider log may contain this error:

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

Update Traefik to a release that negotiates the Docker API version. Traefik shipped that fix in v3.6.1. If you cannot upgrade yet, Docker documents a daemon-side compatibility override. Use it temporarily, then remove it after checking every client that relies on it.

An error naming 1.40 instead of 1.44 belongs to the same class of failure. Check the server version before choosing a remedy.

Check the Docker and Traefik versions

Run these commands against the deployment that reports the error. The examples assume a Compose service named traefik; substitute your service name if it differs.

docker version
docker version --format '{{.Server.MinAPIVersion}}'
docker compose exec traefik traefik version
docker compose logs --tail=50 traefik

The CLI and daemon have separate versions. A current Docker CLI can connect while an older client inside Traefik fails. Also check your Docker context and Traefik’s configured Docker endpoint: a successful CLI command against another daemon proves nothing about this connection.

Docker’s API compatibility matrix lists these default minimums, checked on September 12, 2026:

Docker EngineMinimum API version
28.x1.24
29.0–29.21.44
29.3–29.81.40

A request for 1.24 falls below either Docker 29 minimum. Moving from 29.2 to 29.3 does not make that request compatible. Read the actual server value because an administrator may already have overridden it.

Update Traefik first

Traefik’s fix in PR #12256 removed a hardcoded Docker API version and enabled the SDK’s API negotiation.

Version 3.6.1 identifies the first fix in that release line. For a deployment today, select a maintained release compatible with your configuration and review its migration guidance. A move from Traefik v2 to v3 requires a migration review; do not treat it as a patch update.

Change the Traefik image to your chosen explicit version in the Compose file. From that project directory, pull and recreate the service:

docker compose pull traefik
docker compose up -d traefik
docker compose exec traefik traefik version
docker compose logs --since=5m traefik

Verify both the running version and the provider logs. Then request a known application route and check its expected response. The absence of an API error alone does not prove that labels, networks, and application health are correct.

If Coolify, Dokploy, or another platform manages the proxy, use its supported upgrade procedure. The platform may overwrite your changes to its generated Compose file on the next deployment. Check the version the platform runs rather than assuming its latest release uses a particular Traefik image.

Temporary workaround: lower Docker’s minimum API version

Docker’s Engine 29 announcement documents min-api-version in daemon.json as a mitigation for older clients. This changes which API requests the daemon accepts; it does not update those clients or guarantee their behavior with a newer daemon.

The commands below target Docker Engine on a Linux host managed by systemd. Docker Desktop and managed platforms use different configuration and restart procedures. Their packaging does not establish whether a third-party client can negotiate with the bundled Engine.

Back up your existing daemon configuration. Edit /etc/docker/daemon.json and merge this key into its JSON object:

{
  "min-api-version": "1.24"
}

Use 1.24 for the error shown above. For another client version, choose the minimum you actually need. Preserve existing storage, logging, network, and other daemon options; a replacement file could change unrelated behavior.

Validate the configuration before restarting. Docker’s dockerd reference documents this check:

sudo dockerd --validate --config-file=/etc/docker/daemon.json

If validation rejects the key or value, stop and use an upgrade path supported by your installed Engine. Do not restart with an invalid configuration. Validation checks configuration syntax and accepted options; it does not test Traefik compatibility or account for every conflict with service startup flags.

Plan the restart around your workload:

sudo systemctl restart docker

A daemon restart can interrupt containers. Docker documents the behavior and limits of live restore. Check restart policies and service health after the restart rather than assuming every container will recover. If needed, run docker compose up -d from the affected application’s project directory.

For rootless Engine, check its active configuration location, usually ~/.config/docker/daemon.json, and use systemctl --user restart docker. Follow the rootless documentation for your setup. For Swarm, coordinate node maintenance and preserve manager quorum; do not restart the whole cluster at once.

Verify the workaround and remove it later

Check the server minimum and the affected provider:

docker version --format '{{.Server.MinAPIVersion}}'
docker compose logs --since=5m traefik

The server should report 1.24 if that is the override you configured on this daemon. Test an application route too. If the reported minimum has not changed, check which config file the service loads and which daemon the CLI contacts.

Keep a record of why you added the override. After upgrading Traefik, check other Docker API clients before deleting it. Another tool may still depend on the lower minimum even though routing works.

Remove the key, validate the remaining JSON, and schedule another daemon restart. Repeat the provider and route checks against the restored default minimum. That verifies the client upgrade without the workaround masking a remaining dependency.

Why changing DOCKER_API_VERSION is different

DOCKER_MIN_API_VERSION configures the daemon’s minimum accepted version. DOCKER_API_VERSION forces a version for a client that honors it; Docker documents that it disables API negotiation. Setting a variable in your terminal does not reconfigure an SDK inside an already running Traefik container.

Do not use a forced client version as a substitute for verifying the Traefik fix. The client must understand the API it requests, and the server must accept it. Negotiation handles their supported overlap.

If your logs no longer contain this version error but routes still fail, continue with the specific failure: Docker socket access, provider endpoint, container labels, or network reachability. A 404 or 502 by itself does not identify an API mismatch.

For Go services behind the proxy, see building the application image and propagating cancellation through application work.

Before the next Engine upgrade, record the daemon version and the versions of tools that query it. Test container discovery and one application request with that combination. Keep explicit image versions and a planned update window so you can reproduce the deployment you are testing.

Explore this subject

More on Systems & tooling