v2.4.0
CompareGitHub
This release improves compatibility with Docker v29.
Changes
Major changes (💡 for highlights):
nerdctl image:- 💡Adopted Docker v29 default
nerdctl imagesoutput (IMAGE,ID,DISK USAGE,CONTENT SIZE,EXTRA) (#5093, thanks to @ekalinin) - Added
nerdctl images --treeto show a row per platform an image declares, likedocker image ls --tree(#5092, thanks to @ekalinin) - Added
nerdctl push --all-tags(-a) to push every local tag of a repository (#5133, thanks to @ekalinin) - Added
nerdctl image convert --erofs {raw|zstd}and aligned EROFS pull/push with containerd (#4927, thanks to @ChengyuZhu6) - Added
nerdctl save --quiet(-q) to suppress progress output (#5064, thanks to @s3onghyun) - Fixed
nerdctl image ls <repo>to list all tags of a bare repository name (#5115, thanks to @ankit090701) - Added snapshot info to native
nerdctl image inspect(#5114, thanks to @ningmingxiao) - Pinned the image a container runs to its digest (#5125, thanks to @ekalinin)
- Truncated the output file of
nerdctl saveandnerdctl image export(#5160, thanks to @ekalinin) - Preserved equals signs in image label filter values (#5163, thanks to @immanuwell)
- 💡Adopted Docker v29 default
nerdctl container:- 💡Added
--mount type=image(read-only) (#4990, thanks to @mayur-tolexo) - Added
image-subpathto--mount type=imageto mount a relative path inside the image rootfs instead of the whole rootfs (#4993, thanks to @mayur-tolexo) - Added
--exposeand--publish-all(-P) (#5036, thanks to @Mujib-Ahasan) - 💡Added support for the Docker v25 recursive read-only (RRO) mount form (#5043)
- Allocated a free host port from a published port range for a single container port (#4988, thanks to @s3onghyun)
- Added the
volume-nocopymount option, so existing data in the container is not copied into the volume (#5129, thanks to @jiwahn) - Fixed
--cpuswriting cpuset instead of CFS quota/period (#5067, thanks to @kmaris) - Fixed
nerdctl run/exec -ihanging when stdin reaches EOF during task creation (#5042) - Fixed a foreground stdio deadlock when the internal logging process stops consuming (#5151, thanks to @gsaddict91)
- Added snapshot info to native
nerdctl container inspect(#5118, thanks to @ningmingxiao) - Suppressed a spurious hostsstore NotFound warning on container removal (#5098, thanks to @pujitha24)
- Allowed removing containers that have no network annotations (#5211, thanks to @Arman16-1998)
- Matched
nerdctl ps --filterkeys exactly instead of by prefix (#5197, thanks to @immanuwell)
- 💡Added
nerdctl system:nerdctl build:nerdctl network:- Added
--aux-addresssupport fornerdctl network create(#5041, thanks to @mayur-tolexo) - Added
--ipv4so--ipv4=false --ipv6can create IPv6-only networks (#5024, thanks to @mayur-tolexo) - Matched each
--ip-rangeto its subnet for dual-stack networks (#5018, thanks to @mayur-tolexo) - Stopped injecting
ipRangeinto the CNI config (#5078, thanks to @mayur-tolexo) - Keyed
Networksinnerdctl inspectby the real CNI network name (#5164, thanks to @larrasket) - Combined repeated
--filter name=values with OR (#5206, thanks to @immanuwell) - Supported big-endian hosts when parsing
/proc/net/{tcp,udp}addresses (#5100, thanks to @larrasket)
- Added
nerdctl events:- Added label-based filtering (#4999, thanks to @Mujib-Ahasan)
- Renamed the
Statusfield toActionto match Docker v29 (#5087, thanks to @Akshitguptaa)
nerdctl login:nerdctl compose:- Supported image volumes (
services.<SERVICE>.volumes[].type: image) (#5161, thanks to @papidb) - Stopped requiring CNI plugins for compose projects that do not use CNI (#5132, thanks to @ravi-arnan)
- Allowed detached runs with the default interactive setting (#5212, thanks to @immanuwell)
- Fixed a panic when asserting
x-nerdctl-*compose extension types (#5073, thanks to @arpitjain099)
- Supported image volumes (
nerdctl info:- Implemented rootless systemd cgroup discovery, removing a hard-coded cgroup path (#5182, thanks to @chemwolf6922)
nerdctl top:- Fix handling stopped and paused containers (#5223, thanks to @immanuwell)
Healthcheck:
- Reduced unnecessary function calls (#5048, thanks to @ningmingxiao)
Logging:
Rootless:
- Enabled IPv6 in the RootlessKit network namespace (#5055, thanks to @Akshitguptaa)
nerdctl-full:Documentation:
Misc:
- Hid internal alias flags from help output (#5025, thanks to @immanuwell)
CI and tests:
- Updated CI to Ubuntu 26.04 and Docker 29.6.1, and ran integration tests directly on hosts and Lima guests (#5020, #5021, #5035)
- Continued migrating container, network, and compose tests to Tigron (#4780, #5014, #5045, #5056, #5058, #5063, #5069, #5070, #5071, #5074, #5085, #5086, #5094, #5120, thanks to @must108, @takumi12311123, @papidb, @Mujib-Ahasan, and @ogulcanaydogan)
- Published a weekly flaky test dashboard ("Soigneur") and attempted to deflake several tests (#5201, #5217, #5218)
- Printed daemon logs after integration test failures (#5165, thanks to @loglapa)
- Dropped an outdated containerd 1.x plugin requirement from the restart tests (#5185, thanks to @webdevsamran)
- Fixed
lint-licensesfailing on MPL-2.0 (#5200, thanks to @filipPlevjak) - Reported gosocialcheck findings as GitHub Actions annotations, and fixed a zizmor failure (#5208, #5215)
And more!
Full changes: https://github.com/containerd/nerdctl/milestone/66?closed=1
Thanks to @ChengyuZhu6, @ekalinin, @mayur-tolexo, @immanuwell, @ningmingxiao, @larrasket, @papidb, @haytok, @Mujib-Ahasan, @s3onghyun, @Akshitguptaa, @MsfPablo, @ankit090701, @ravi-arnan, @arpitjain099, @kmaris, @pujitha24, @VedantMadane, @xianyuwu, @jiwahn, @gsaddict91, @locker95, @chemwolf6922, @Arman16-1998, @loglapa, @webdevsamran, @filipPlevjak, @MayCXC, @ogulcanaydogan, @must108, @takumi12311123, @subotac, and @nikolauspschuetz.
[!NOTE] Claude Opus 5 was used for updating this release note from v2.4.0-beta.0.
Compatible containerd versions
This release of nerdctl is expected to be used with containerd v1.7 or later. Some features may not work with other releases of containerd.
About the binaries
- Minimal (
nerdctl-2.4.0-linux-amd64.tar.gz): nerdctl only - Full (
nerdctl-full-2.4.0-linux-amd64.tar.gz): Includes dependencies such as containerd, runc, and CNI
Minimal
Extract the archive to a path like /usr/local/bin or ~/bin .
<details><summary>tar Cxzvvf /usr/local/bin nerdctl-2.4.0-linux-amd64.tar.gz</summary>
<p>
-rwxr-xr-x root/root 32395426 2026-09-20 04:26 nerdctl
-rwxr-xr-x root/root 23390 2026-09-20 04:25 containerd-rootless-setuptool.sh
-rwxr-xr-x root/root 9555 2026-09-20 04:25 containerd-rootless.sh</p> </details>
Full
Extract the archive to a path like /usr/local or ~/.local .
<details><summary>tar Cxzvvf /usr/local nerdctl-full-2.4.0-linux-amd64.tar.gz</summary> <p>
drwxr-xr-x 0/0 0 2026-09-20 04:36 bin/
-rwxr-xr-x 0/0 34512200 2026-09-01 12:47 bin/buildctl
-rwxr-xr-x 0/0 29909144 2025-05-12 13:10 bin/buildg
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-bandwidth -> ../libexec/cni/bandwidth
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-bridge -> ../libexec/cni/bridge
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-dhcp -> ../libexec/cni/dhcp
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-dummy -> ../libexec/cni/dummy
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-firewall -> ../libexec/cni/firewall
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-host-device -> ../libexec/cni/host-device
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-host-local -> ../libexec/cni/host-local
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-ipvlan -> ../libexec/cni/ipvlan
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-loopback -> ../libexec/cni/loopback
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-macvlan -> ../libexec/cni/macvlan
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-portmap -> ../libexec/cni/portmap
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-ptp -> ../libexec/cni/ptp
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-sbr -> ../libexec/cni/sbr
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-static -> ../libexec/cni/static
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-tap -> ../libexec/cni/tap
lrwxrwxrwx 0/0 0 2026-09-20 04:34 bin/buildkit-cni-tuning -> ../libexec/cni/tuning
lrwxrwxrwx 0/0 0 2026-
…(truncated)