Fork 0
convert docker images to rootfs
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Go to file
Motiejus Jakštys 1c46fb8617 release: a better changelog 1 year ago
rootfs rootfs: remove ./ prefix from filenames 1 year ago
.build.yml [ci] merge test and lint steps to one 2 years ago
.gitignore add WithFilePrefix 2 years ago
LICENSE add license 3 years ago
Makefile remove unnecessary support for prebuilt binaries 2 years ago
README.md remove references to 'official' binaries 2 years ago
go.mod revert go.mod 3 years ago
main.go Revert "add WithFilePrefix" 2 years ago
main_test.go Revert "add WithFilePrefix" 2 years ago
release release: a better changelog 1 year ago


godocs.io builds.sr.ht status


Converts a Docker image (a bunch of layers) to a flattened "rootfs" tarball.


Docker images became a popular way to distribute applications with their dependencies; however, Docker is not the best runtime environment. At least not for everyone. May boring technology run our software.

Undocker bridges the gap between application images (in docker image format) and application isolation ("container") runtimes: once the docker image is extracted, it can be run with old-fashioned tools: lxc, systemd-nspawn, systemd, FreeBSD Jails, and many others.


Build it like this for the "current" platform:

$ make undocker

make -B will print the extra flags (-X <...>) for cross-compiling with other archs. It's all go build <...> in the back, and depends only on Go's compiler and stdlib.

Usage: convert docker image to rootfs

Download busybox docker image from docker hub and convert it to a rootfs:

$ skopeo copy docker://docker.io/busybox:latest docker-archive:busybox.tar
$ undocker busybox.tar - | tar -xv | sponge | head -10; echo '<...>'

Refer here for other ways to download Docker images. There are many.

On author's laptop converting a 1.1GB Docker image with 77 layers takes around 3 seconds and uses ~65MB of residential memory.

Usage example: systemd

systemd-run \
  --wait --pty --collect --service-type=exec \
  -p RootDirectory=$PWD \
  -p ProtectProc=invisible \
  -p PrivateUsers=true \
  -p DynamicUser=yes \
  -- busybox httpd -vfp 8080

Systemd protections like PrivateUsers, DynamicUser, ProtectProc and others are available, just like to any systemd unit.

Similar Projects



  • initial release: rootfs.Flatten and a simple command-line application.


The following contributions may be accepted:

  • Patchsets, with accompanying tests.
  • Regression reports.

If you found a container that undocker cannot extract, or extracts incorrectly and you need this that work with undocker, do not submit an issue: submit a patchset.

Reports of regression reports must provide examples of "works before" and "does not work after". Issues without an accompanying patch will most likely be rejected.


Use ~motiejus/undocker@lists.sr.ht for questions or patches. Subscribe here.