◑no error, different result
Containers get 1024 open files instead of 1048576
Affects: Jobs that start databases, search engines or JVM services with docker run, Compose or service containers.
Docker 29.0 moved to containerd 2.1.5, which uses systemd's default LimitNOFILE for containers. In the release notes' words, this changes ulimit -n from 1048576 to 1024. Docker prints nothing; a busy service fails later with the operating system's "Too many open files" (EMFILE).
Check before upgrading
docker run --rm <your-image> sh -c 'ulimit -n'
Run it as a step on ubuntu-26.04. 1024 means the new default applies to that job.
Fix
- Raise it where the container starts: docker run --ulimit nofile=65536:65536, or ulimits: nofile in the Compose file.
- Give the service a limit it actually needs rather than restoring 1048576 everywhere.
Source: Docker Engine 29 release notes
◆worth knowing
"Client version is too old": the Docker 29 floor is lower than most guides say
Affects: Jobs where an older client or library talks to the runner's Docker daemon: SDKs embedded in tools, or an old CLI in a container.
Docker 29.0 made the daemon require API v1.44 (Docker 25) or later, and many guides still say so. Docker 29.3 lowered the minimum back to API v1.40, which is Docker 19.03 (moby#52067). The runner's 29.4.2 has that lower floor, so only clients older than 19.03 are refused.
What you see
client version %s is too old. Minimum supported API version is %s, please upgrade your client to a newer version
From moby source at docker-v29.4.2, daemon/server/middleware/version.go; the two values are filled in from the request.
Check before upgrading
docker version
Server: Engine 29.4.2 on the new image; its API version line shows the minimum it accepts.
Fix
- Upgrade the client or library that sends the old API version. Pinning DOCKER_API_VERSION to an old value makes it worse, not better.
Source: Docker Engine 29 release notes
◑no error, different result
--link no longer sets environment variables
Affects: Scripts that start containers with --link and read the *_PORT_* or *_ENV_* variables it used to create.
Docker 29 stopped adding the environment variables that legacy links set; they are deprecated. The application sees them empty. The release notes give a temporary escape hatch, starting the daemon with DOCKER_KEEP_DEPRECATED_LEGACY_LINKS_ENV_VARS=1, and say it will be removed in a later version.
Check before upgrading
grep -rn -- '--link' .github/ scripts/ 2>/dev/null
Any docker run --link in CI.
Fix
- Put the containers on a user-defined network and address them by name, or pass the values explicitly with -e.
Source: Docker Engine 29 release notes
◑no error, different result
docker image ls prints a different view
Affects: Scripts that parse the plain output of docker images or docker image ls.
Docker 29's docker image ls uses the new collapsed tree view by default. Output parsed with awk or cut can stop matching.
Check before upgrading
grep -rnE 'docker (image ls|images)' .github/ scripts/ 2>/dev/null | grep -v -- '--format'
Any match that parses the table rather than asking for a format.
Fix
- Ask for exactly what you need: docker image ls --format '{{.Repository}}:{{.Tag}}', or --quiet for IDs.
Source: Docker Engine 29 release notes
◆worth knowing
Compose jumps from v2 to v5, and builds go through Bake
Affects: Jobs that run docker compose build, or check the Compose version in a script.
Compose v5.0.0 removed its internal builder; builds are delegated to Docker Bake, the same path as docker build. The version skips 3 and 4 on purpose, to avoid confusion with the old file-format versions. The runner also ships buildx 0.38.0, so BuildKit is there for Bake to use.
Check before upgrading
docker compose version
v5.1.3 on the new image. A script that expects a version starting with 2 needs updating.
Check before upgrading
docker compose build
Run it once on ubuntu-26.04 before the migration reaches you.
Fix
- Fix version checks to accept 5. If a build behaves differently, compare it with the same Dockerfile under docker buildx bake.
Source: Docker Compose v5.0.0 release notes