Alpine's apk

Alpine Linux 13,255 builds on musl libc and BusyBox 65,982 instead of glibc and GNU coreutils, and its package manager, apk, is correspondingly small and fast. It has no separate low-level tool: apk fetches, resolves and installs in one program, and it keeps the list of packages you asked for in /etc/apk/world, like the dependencies of a package.json.

Installing jq with apk in Alpine 3.24Shell
docker run --rm --name l1-apk alpine:3.24 sh -c '
  apk --version
  apk add --no-cache jq
  apk info -R jq
  apk info -W /usr/bin/jq
  apk search -e nodejs npm'
Output
apk-tools 3.0.8-r0, compiled for x86_64.
(1/2) Installing oniguruma (6.9.10-r0)
(2/2) Installing jq (1.8.2-r0)
Executing busybox-1.37.0-r31.trigger
OK: 9094 KiB in 18 packages
jq-1.8.2-r0 depends on:
so:libc.musl-x86_64.so.1
so:libonig.so.5
/usr/bin/jq is owned by jq-1.8.2-r0
nodejs-24.18.1-r0
nodejs-current-26.5.1-r0
npm-11.12.1-r0

The install, index download included, takes about 1.4 seconds (timed separately) and leaves 18 packages in 9 MB. apk info -R shows that dependencies are declared on shared libraries (so:libonig.so.5) rather than on package names, so any package providing that library satisfies them. The last line is a familiar story: Alpine's own nodejs package is 24.18.1 (with Node.js 26 2,131 as nodejs-current), behind the 24.21.0 in node:24-alpine, which the Node.js Docker 514 team builds separately.

Alpine 3.24 (June 2026) ships apk-tools 3, introduced in 3.23. It supports a new package format, but Alpine still publishes the old v2 format (jq-1.8.2-r0.apk is a plain gzip stream), and the commands are unchanged.