Docker containers are awesome little throwaway environments. Often I like to jump into a container to test something out, like installing a project from scratch, swapping runtimes without needing a version manager, or trying something new without gumming up my base system. It’s also useful for debugging problems in other Linux distributions or as a quick approximation of some remote machine.
Usually when I jump into a Docker image, though, I like to bring my files with me by mounting
$(pwd). This works pretty well but has a few annoyances:
- If I do something that generates files in my working directory, like
pytest, I have to manually clean it up once I’m done.
- File ownership becomes a stew of
rootand other UIDs.
docker run --rm -ti -v $(pwd):/work -w /work $image /bin/shis a real pain to type, and I can never remember which images have
/bin/bashinstalled, which is generally a more pleasant experience than bare
I started to hack away at these annoyances one at a time in a shell alias, which evolved into a shell function, which further evolved into a full-blown shell project. Meet dockit, the utility that can drop you into a Docker image in a single command:
$ dockit alpine Using default tag: latest latest: Pulling from library/alpine Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb Status: Image is up to date for alpine:latest docker.io/library/alpine:latest $ /docked #
dockit drops you into a directory called
/docked with the best available shell. The
/docked directory is owned by the most sensible user
dockit can find — the image
USER if possible and
root if not.
Changes made in the
/docked directory don’t propagate back to the host, so you can generate cache files, delete stuff, and generally make a mess of things without having to clean it up. If you want to explicitly export something back to the host, you can use the special
undock will copy a file or folder from the
/docked directory back to the host directory, fixing its ownership along the way.
A word of warning,
dockit is meant to be used from a smallish directory, like a git repository. Depending on how recent your kernel is, attempting to
dockit a large directory may end up taking a lot of time and/or disk space. (That said, because I'm on a kernel version where
metacopy=on, I can mount my entire 100+ GB home directory in about ten seconds and no appreciable bloat in disk usage, so, your mileage may vary!)
If this sounds like a tool you’d like to have in your toolbox, check out
dockit on GitHub.