I recently employed a little trick to make Docker data-only images which can be joined into other Docker images as needed.
Imagine you have a set of configuration that you want to store somewhere separately to the code. Well, you can make a Docker image of just this configuration very easily:
FROM scratch ADD ./ /fake-config
After building it with
docker build -t test/fake-config ., the only thing inside this image will be the directory you added. This is the most barebones image it is possible to make outside of
scratch itself 1.
Now, you may wonder what the use of an image like this is — after all, it can’t be executed or run because it has no binaries inside. Enter the
COPY --from command:
FROM <some base image> # ... COPY --from=test/fake-config /fake-config /fake-config # ...
With one command, the contents of your data-only image has been added to another image. This is super useful for adding configuration that you want shared between applications to the Docker images for them 2.
There is actually some low-level plumbing within an image based on
This is especially true since you can’t use symlinks within a Docker context, making it difficult to otherwise do this without some script to wrap the call to
docker buildthat copies the common stuff around — messy. ↩