Data-Only Images In Docker By Abusing COPY --from
02 Jan 2018
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
scratch
. ↩ -
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 build
that copies the common stuff around — messy. ↩