Recently, I hit an issue where building docker images on containers meant that the Docker cache wasn’t being persisted from one build to the next. So even if you ran an identical build on the next run, it’d still rebuild every step, costing you valuable time.
Luckily, it’s not too difficult to save your Docker cache and to restore it (or distribute it) to other machines. It’s a bit more difficult than it used to be, but with a bit of scripting magic, it’s easy enough.
How it Used to Be
Apparently (though before I started working much with Docker), when you used to push a Docker image to a remote repository, it’d include all layers of that image. That means when you pulled in image, you’d get its entire history as well. This made things easier for distributing or restoring the cache, because all you had to do was pull the image. Unfortunately, it also made things clunky, in that you had to download more data than you actually needed to run the image.
Shortly after that, Docker supported saving the entire cache using
docker save -o file.tar <image_name> and restoring it using
docker load -i file.tar. But now,
docker save has been streamlined, too, so saving your cache isn’t quite as simple as it used to be.
Saving Your Cache
Luckily, despite those changes, you can still use the
docker save command to get your image’s full cache – the catch is that you have to save all the layers listed in your image’s
So, to save your image’s cache, run the following command:
docker save -o output.tar $(docker history -q <image_name>[:image_tag] | tr '\n' ' ' | tr -d '<missing>')
docker history with the
-q (quiet) tag, so it only shows the ids of each layer. Since you’re probably building
FROM another image, much of the history will show
<missing>, because you don’t have the entire history of the image you’re building
Next up, the command pipes the output to
tr twice, to clear out any
\ns and any
<missing> output. So, in the end, you get a list of image IDs passed directly to
Loading Your Cache
Loading your cache is exactly how it used to be – after you’ve copied or moved the tar file containing your cache, just run
docker load -i <filename> and you’ll have your cache all ready to go!