This error occurs when your Docker client uses an older API version than the minimum supported by the Docker daemon. Common after Docker Engine 29.0 upgrade which raised the minimum API to v1.44. Fix by updating the client, lowering daemon's minimum API, or using DOCKER_API_VERSION.
When Docker commands are executed, the Docker client communicates with the Docker daemon through a REST API. Both the client and daemon support specific API versions, and version negotiation occurs automatically to find a compatible version they can both speak. The "client version is too old" error indicates that your Docker client is trying to use an API version that the Docker daemon no longer supports. This became a widespread issue with Docker Engine 29.0.0 (released in 2025), which raised the minimum supported API version from v1.24 to v1.44, effectively requiring Docker clients to be version 25.0 or newer. This error commonly affects: - **CI/CD pipelines** using older Docker-in-Docker images or Docker clients - **Third-party tools** like Traefik, Portainer, or Testcontainers that use older Docker SDKs - **Remote Docker setups** where the client and server versions are mismatched - **Development environments** after a Docker daemon upgrade without upgrading the client The mismatch can occur in either direction - a client that's too old for the server, or less commonly, a server that's too old for the client.
First, identify exactly which API versions your client and server support:
docker versionThis shows both client and server versions with their API versions:
Client:
Version: 24.0.7
API version: 1.43
...
Server:
Engine:
Version: 29.0.0
API version: 1.48 (minimum version 1.44)
...In this example, the client supports API 1.43 but the server requires minimum 1.44, causing the error.
If docker version itself fails, the client cannot even negotiate with the server. Check what version you have:
docker --version
which dockerThe cleanest solution is to update your Docker client to a version that supports the required API.
On Linux (Ubuntu/Debian):
# Update package list and upgrade Docker
sudo apt-get update
sudo apt-get install --only-upgrade docker-ce docker-ce-cli containerd.io
# Verify the upgrade
docker versionOn Linux (CentOS/RHEL/Fedora):
sudo dnf upgrade docker-ce docker-ce-cli containerd.io
# or
sudo yum upgrade docker-ce docker-ce-cli containerd.ioOn macOS/Windows (Docker Desktop):
Update Docker Desktop through the application's update mechanism or download the latest version from https://www.docker.com/products/docker-desktop
For CI/CD pipelines:
Update your Docker client image to match the server:
# GitLab CI example - pin to a compatible version
image: docker:29.0
services:
- docker:29.0-dindIf you cannot update all clients (e.g., third-party tools), configure the Docker daemon to accept older API versions.
Method A: Edit daemon.json
# Create or edit daemon.json
sudo nano /etc/docker/daemon.jsonAdd or merge in this configuration:
{
"min-api-version": "1.24"
}Use the API version your clients require. Common values:
- 1.24 - Supports Docker 1.12+
- 1.40 - Supports Docker 19.03+
- 1.41 - Supports Docker 20.10+
- 1.43 - Supports Docker 24.0+
Restart Docker:
sudo systemctl restart dockerVerify the change:
docker version
# Should show: API version: 1.48 (minimum version 1.24)For Docker Desktop (macOS/Windows):
Go to Settings -> Docker Engine and add "min-api-version": "1.24" to the JSON configuration.
Method B: Systemd environment variable
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/min-api-version.conf << 'EOF'
[Service]
Environment="DOCKER_MIN_API_VERSION=1.24"
EOF
sudo systemctl daemon-reload
sudo systemctl restart dockerForce the Docker client to use a specific API version by setting an environment variable. This is useful for temporary fixes or debugging.
For single commands:
DOCKER_API_VERSION=1.44 docker ps
DOCKER_API_VERSION=1.44 docker-compose upFor your shell session:
export DOCKER_API_VERSION=1.44
docker ps # Now uses API 1.44In CI/CD pipelines (GitLab example):
variables:
DOCKER_API_VERSION: "1.44"
build:
script:
- docker build -t myapp .In docker-compose.yml:
services:
myservice:
environment:
- DOCKER_API_VERSION=1.44Important: This only works if the client supports the specified version. Setting a version higher than your client supports will fail.
If you need immediate compatibility and cannot update clients, you can temporarily downgrade the Docker daemon.
On Ubuntu/Debian:
# List available versions
apt-cache madison docker-ce
# Downgrade to a specific version (e.g., 28.0.4)
sudo apt-get install docker-ce=5:28.0.4-1~ubuntu.22.04~jammy docker-ce-cli=5:28.0.4-1~ubuntu.22.04~jammy
# Hold the version to prevent auto-upgrade
sudo apt-mark hold docker-ce docker-ce-cliOn CentOS/RHEL:
# List available versions
yum list docker-ce --showduplicates
# Downgrade
sudo yum downgrade docker-ce-28.0.4 docker-ce-cli-28.0.4
# Hold the version
sudo yum versionlock docker-ce docker-ce-cliFor Docker-in-Docker in CI/CD:
Pin to a specific version instead of using :latest or :dind:
services:
- docker:28.0.4-dindWarning: Downgrading is a temporary measure. Plan to update your clients to maintain security patches and new features.
Popular container management tools may need updates or configuration changes.
Traefik:
Traefik versions before 3.3.6 / 2.11.18 use API v1.24 by default. Either:
1. Update Traefik to the latest version (recommended)
2. Lower daemon's min-api-version to 1.24
3. Traefik 3.3.6+ supports API version negotiation
# docker-compose.yml for Traefik
services:
traefik:
image: traefik:v3.3.6 # or newerPortainer:
Update to the latest Portainer version:
docker pull portainer/portainer-ce:latest
# Restart your Portainer containerTestcontainers:
Update your Testcontainers dependency to the latest version:
<!-- Maven -->
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>1.21.0</version> <!-- Use latest -->
</dependency>// Gradle
testImplementation 'org.testcontainers:testcontainers:1.21.0'Docker SDK for Python/Go/Node.js:
Update to the latest SDK version that supports API negotiation.
After applying your chosen solution, verify everything works:
# Check versions
docker version
# Test basic operations
docker ps
docker images
docker pull hello-world
docker run --rm hello-world
# Check daemon configuration
docker info | grep -i "api version"For CI/CD pipelines:
Run a test pipeline to ensure all Docker operations work correctly.
For third-party tools:
- Check Traefik logs: docker logs traefik
- Check Portainer can connect to Docker
- Run your Testcontainers test suite
If issues persist:
Check for multiple Docker installations or cached client binaries:
which -a docker
type dockerEnsure you're using the correct Docker binary and that no old versions remain in your PATH.
### Understanding Docker API Versioning
Docker's API uses semantic versioning independent of Docker Engine versions. Here's the mapping:
| API Version | Docker Engine Version | Notes |
|-------------|----------------------|-------|
| 1.24 | 1.12+ | Long-standing minimum |
| 1.40 | 19.03+ | Added BuildKit support |
| 1.41 | 20.10+ | Added manifest list support |
| 1.43 | 24.0+ | |
| 1.44 | 25.0+ | New minimum in Docker 29.0 |
| 1.48 | 29.0+ | Current as of Docker 29 |
### API Version Negotiation
Modern Docker clients (1.13+) support automatic API version negotiation. When connecting, the client:
1. Queries the server's supported API versions
2. Selects the highest version both support
3. Uses that version for subsequent requests
This negotiation can be disabled by setting DOCKER_API_VERSION explicitly, which is sometimes needed for debugging but generally not recommended.
### Why Docker 29.0 Made This Breaking Change
Docker 29.0 dropped support for API versions below 1.44 because:
1. Maintenance burden: Supporting old API versions requires extensive backward compatibility code
2. Security: Old API versions may have security vulnerabilities
3. Feature parity: New features require minimum API versions
4. Docker 25.0+ EOL: Versions before 25.0 are no longer supported
### Remote Docker Connections
When connecting to a remote Docker daemon over TCP or SSH, version mismatches are common:
# SSH connection to remote Docker
export DOCKER_HOST=ssh://user@remote-host
docker version # May show version mismatchSolutions:
1. Update Docker on the remote host
2. Set DOCKER_API_VERSION to match the remote daemon
3. Configure min-api-version on the remote daemon
### Docker Contexts
If you use Docker contexts to manage multiple Docker endpoints, check each context's compatibility:
# List contexts
docker context ls
# Check version for a specific context
docker --context my-remote-server version### Buildx and API Versions
Docker Buildx has its own version requirements. If builds fail with API version errors:
# Check buildx version
docker buildx version
# Update buildx
docker buildx install### Kubernetes Integration
If using Docker with Kubernetes (e.g., Docker Desktop's Kubernetes), ensure both are updated together to maintain compatibility.
### Monitoring for Version Drift
In production environments, consider monitoring Docker versions across your infrastructure to catch version mismatches early:
# Script to check versions across hosts
for host in host1 host2 host3; do
echo "=== $host ==="
ssh $host "docker version --format '{{.Server.Version}} API:{{.Server.APIVersion}}'"
doneimage operating system "linux" cannot be used on this platform
How to fix 'image operating system linux cannot be used on this platform' in Docker
manifest unknown: manifest unknown
How to fix 'manifest unknown' in Docker
cannot open '/etc/passwd': Permission denied
How to fix 'cannot open: Permission denied' in Docker
Error response from daemon: failed to create the ipvlan port
How to fix 'failed to create the ipvlan port' in Docker
toomanyrequests: Rate exceeded for anonymous users
How to fix 'Rate exceeded for anonymous users' in Docker Hub