Skip to content

Instantly share code, notes, and snippets.

@rheinwein
Last active June 30, 2016 08:34
Show Gist options
  • Save rheinwein/68295ab897fcd66c24de0d9fcb03e75e to your computer and use it in GitHub Desktop.
Save rheinwein/68295ab897fcd66c24de0d9fcb03e75e to your computer and use it in GitHub Desktop.
saving base image outside of customer image

When preserving the parent/child layer relationship via docker save and docker load, all layers of the image must be saved together, including the base image. Note: if an image is tagged, you can use the tag name in place of the image ID.

I'm using Docker 1.12-rc2. Behavior may vary on pre-1.10 versions.

Saving and loading the base image separately -- cache is not repopulated

This is because the bottom layer of the customer image does not receive the parent ID when being saved. When it's loaded, Docker doesn't know that the two images belong together. A subsequent docker build will show the base image being used, but there is no available cache because of the missing link between customer and base image. In the image rebuild output, notice there is no using cache output.

cache-test $ docker build -t cache-test .
Sending build context to Docker daemon 2.663 MB
Step 1 : FROM busybox
latest: Pulling from library/busybox
8ddc19f16526: Pull complete 
Digest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6
Status: Downloaded newer image for busybox:latest
 ---> 2b8fd9751c4c
Step 2 : RUN mkdir this
 ---> Running in f9e3603fe8d1
 ---> d2e4b49a4a50
Removing intermediate container f9e3603fe8d1
Step 3 : RUN mkdir this-is
 ---> Running in a2cdf4b29dd1
 ---> 1cc5b31c32b2
Removing intermediate container a2cdf4b29dd1
Step 4 : RUN mkdir this-is-a
 ---> Running in b1cdfbad1b47
 ---> b43cb6c49076
Removing intermediate container b1cdfbad1b47
Step 5 : RUN mkdir this-is-a-test
 ---> Running in 080f5c041d04
 ---> de6bf919403f
Removing intermediate container 080f5c041d04
Step 6 : RUN echo "Hello, world!"
 ---> Running in 9342d902fde8
Hello, world!
 ---> 92b73c4ed8a6
Removing intermediate container 9342d902fde8
Successfully built 92b73c4ed8a6
cache-test $ docker history -q busybox
2b8fd9751c4c
<missing>
cache-test $ docker save busybox 2b8fd9751c4c > busybox.tar
cache-test $ docker history -q cache-test
92b73c4ed8a6
de6bf919403f
b43cb6c49076
1cc5b31c32b2
d2e4b49a4a50
2b8fd9751c4c
<missing>
cache-test $ docker save cache-test de6bf919403f b43cb6c49076 1cc5b31c32b2 d2e4b49a4a50 > cache-test.tar
cache-test $ docker rmi $(docker images -q)
Untagged: cache-test:latest
Deleted: sha256:92b73c4ed8a61a5223cee5a8907879c6c7db97f388878daf034091f1d0434ed2
Deleted: sha256:de6bf919403fbac7c268b249a1f9e6633d7487f63c7a7f0dec83d6940f4f3e0b
Deleted: sha256:7588d87a002c5586394c9d02471004f1384a0a4f08962ca27a1600dfc425751d
Deleted: sha256:b43cb6c49076f43f65191f165f4c4cd51361fb5d97c2e2a25f9852a0c656fc84
Deleted: sha256:533693507cf19eceb5ee52a5f133b35cc3a5db6a48dc532557c964518952c5d0
Deleted: sha256:1cc5b31c32b2dcd4e481907a207598f85178e4d6392f20b01463b421d3068000
Deleted: sha256:1fbcdb9d3969afe02dfa2ed8bd63b355b55a57ae5f907f1c92784babb612727b
Deleted: sha256:d2e4b49a4a50a001755a7bfaa19986bd6be5d30350cd1fb566cf7727c20455cc
Deleted: sha256:2775550fc501ed21aa796b390b5b898b4149238e0a0927d5b7f7ffa60f0410b6
Untagged: busybox:latest
Deleted: sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749
Deleted: sha256:8ac8bfaff55af948c796026ee867448c5b5b5d9dd3549f4006d9759b25d4a893
cache-test $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cache-test $ docker load -i busybox.tar 
8ac8bfaff55a: Loading layer [==================================================>] 1.293 MB/1.293 MB
Loaded image: busybox:latest
cache-test $ docker load -i cache-test.tar 
b16add7f51b2: Loading layer [==================================================>] 1.536 kB/1.536 kB
842fb36cbd4c: Loading layer [==================================================>] 1.536 kB/1.536 kB
7168d0fb8b89: Loading layer [==================================================>] 1.536 kB/1.536 kB
07577e40f9aa: Loading layer [==================================================>] 1.536 kB/1.536 kB
Loaded image: cache-test:latest
Loaded image ID: sha256:1cc5b31c32b2dcd4e481907a207598f85178e4d6392f20b01463b421d3068000
Loaded image ID: sha256:d2e4b49a4a50a001755a7bfaa19986bd6be5d30350cd1fb566cf7727c20455cc
Loaded image ID: sha256:92b73c4ed8a61a5223cee5a8907879c6c7db97f388878daf034091f1d0434ed2
Loaded image ID: sha256:de6bf919403fbac7c268b249a1f9e6633d7487f63c7a7f0dec83d6940f4f3e0b
Loaded image ID: sha256:b43cb6c49076f43f65191f165f4c4cd51361fb5d97c2e2a25f9852a0c656fc84
cache-test $ docker build -t cache-test .
Sending build context to Docker daemon 2.666 MB
Step 1 : FROM busybox
 ---> 2b8fd9751c4c
Step 2 : RUN mkdir this
 ---> Running in ca184ef3d59a
 ---> 850089417eb8
Removing intermediate container ca184ef3d59a
Step 3 : RUN mkdir this-is
 ---> Running in c4d68c33e46d
 ---> 779797f84d22
Removing intermediate container c4d68c33e46d
Step 4 : RUN mkdir this-is-a
 ---> Running in 13aab06ccff4
 ---> 07a5017c5e8e
Removing intermediate container 13aab06ccff4
Step 5 : RUN mkdir this-is-a-test
 ---> Running in be2637cae0e2
 ---> 468e6f0a9609
Removing intermediate container be2637cae0e2
Step 6 : RUN echo "Hello, world!"
 ---> Running in 0732f01c144c
Hello, world!
 ---> 3702d9e26b9b
Removing intermediate container 0732f01c144c
Successfully built 3702d9e26b9b

Saving the base image with the customer image does repopulate the cache

The last layer of the customer image does know about its parent -- the base image -- so when rebuilding the image, there's an available cache.

cache-test $ docker build -t cache-test .
Sending build context to Docker daemon 6.656 kB
Step 1 : FROM busybox
latest: Pulling from library/busybox
8ddc19f16526: Pull complete 
Digest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6
Status: Downloaded newer image for busybox:latest
 ---> 2b8fd9751c4c
Step 2 : RUN mkdir this
 ---> Running in 3d713cda5a8c
 ---> 97f07eb126e0
Removing intermediate container 3d713cda5a8c
Step 3 : RUN mkdir this-is
 ---> Running in 26ae6ddc6d15
 ---> 4434a67c5235
Removing intermediate container 26ae6ddc6d15
Step 4 : RUN mkdir this-is-a
 ---> Running in 1002f88777c1
 ---> a15d57204c04
Removing intermediate container 1002f88777c1
Step 5 : RUN mkdir this-is-a-test
 ---> Running in cefe4fa5c3b5
 ---> 8f5c2c4a635a
Removing intermediate container cefe4fa5c3b5
Step 6 : RUN echo "Hello, world!"
 ---> Running in 5bd0a6b4151d
Hello, world!
 ---> 67129f44bc64
Removing intermediate container 5bd0a6b4151d
Successfully built 67129f44bc64
cache-test $ docker history -q cache-test
67129f44bc64
8f5c2c4a635a
a15d57204c04
4434a67c5235
97f07eb126e0
2b8fd9751c4c
<missing>
cache-test $ docker save cache-test 8f5c2c4a635a a15d57204c04 4434a67c5235 97f07eb126e0 busybox > cache-test.tar
cache-test $ docker rmi $(docker images -q)
Untagged: cache-test:latest
Deleted: sha256:67129f44bc64631906b1bf35af0765761a2f613920fc2f2c3f8a967fa81fb5d1
Deleted: sha256:8f5c2c4a635a3fb88d88227d100d074a69b1440c403ec2b66252bbef88909072
Deleted: sha256:0ea0af01aa6106891eb7474179ee20f72bf6733c44f482d66298f16e33bb0fd9
Deleted: sha256:a15d57204c04c9262abd5cd42a6dfe8f46d38d5d5e67dd6ff0ab37931d7e6b9e
Deleted: sha256:73cd4b29e0d9da50b4c4f8592cc6797fcfcf548df994709357fa25d695f4d9ce
Deleted: sha256:4434a67c5235a37bac7d3411a84d6188b0794a153ef95bce7d38b914bea369c8
Deleted: sha256:6f8150f9ba3517fbc9c6b00951cee36d457f1994b1e6ef201fabfa71f472322a
Deleted: sha256:97f07eb126e0e27c1042e601420dd62eddfa2a12cb22ae094fd19c2fb1e7151c
Deleted: sha256:d3f0e82c1c7d33e1a2f1b7da8f445359ef3ab189aaf3add6c529fdfc23862dfd
Untagged: busybox:latest
Deleted: sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749
Deleted: sha256:8ac8bfaff55af948c796026ee867448c5b5b5d9dd3549f4006d9759b25d4a893
cache-test $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cache-test $ docker load -i cache-test.tar 
8ac8bfaff55a: Loading layer [==================================================>] 1.293 MB/1.293 MB
97a521634ee1: Loading layer [==================================================>] 1.536 kB/1.536 kB
Loaded image: busybox:latest
07bab91c23c7: Loading layer [==================================================>] 1.536 kB/1.536 kB
3136ae9e210a: Loading layer [==================================================>] 1.536 kB/1.536 kB
32ab8b8df278: Loading layer [==================================================>] 1.536 kB/1.536 kB
Loaded image: cache-test:latest
Loaded image ID: sha256:97f07eb126e0e27c1042e601420dd62eddfa2a12cb22ae094fd19c2fb1e7151c
Loaded image ID: sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749
Loaded image ID: sha256:67129f44bc64631906b1bf35af0765761a2f613920fc2f2c3f8a967fa81fb5d1
Loaded image ID: sha256:8f5c2c4a635a3fb88d88227d100d074a69b1440c403ec2b66252bbef88909072
Loaded image ID: sha256:a15d57204c04c9262abd5cd42a6dfe8f46d38d5d5e67dd6ff0ab37931d7e6b9e
Loaded image ID: sha256:4434a67c5235a37bac7d3411a84d6188b0794a153ef95bce7d38b914bea369c8
cache-test $ docker build -t cache-test .
Sending build context to Docker daemon 2.663 MB
Step 1 : FROM busybox
 ---> 2b8fd9751c4c
Step 2 : RUN mkdir this
 ---> Using cache
 ---> 97f07eb126e0
Step 3 : RUN mkdir this-is
 ---> Using cache
 ---> 4434a67c5235
Step 4 : RUN mkdir this-is-a
 ---> Using cache
 ---> a15d57204c04
Step 5 : RUN mkdir this-is-a-test
 ---> Using cache
 ---> 8f5c2c4a635a
Step 6 : RUN echo "Hello, world!"
 ---> Using cache
 ---> 67129f44bc64
Successfully built 67129f44bc64
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment