Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Script to (selectively) save/load multiple Docker images
#!/usr/bin/env bash
# Script to (selectively) save/load multiple Docker images to/from a directory.
# Run ./save-load-docker-images.sh for help.
set -e
directory=$PWD
filter=""
compress=0
while getopts ":f:d:z" opt ${@:2}; do
case $opt in
f)
filter=$OPTARG
;;
d)
directory=$OPTARG
;;
z)
compress=1
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
help () {
echo
echo "\
Usage: save [-f filter] [-d dir] Save all Docker images to a directory
load [-f filter] [-d dir] Find all saved images (.tar) in a directory then import to Docker
-d dir Directory to save/load images to/from (defaults to \$PWD)
-f filter Filter images by their name (inclusive)
-z Use gzip to compress/uncompress archives (saved/loaded as *.tar.gz)"
echo
}
get-image-field() {
local imageId=$1
local field=$2
: ${imageId:? required}
: ${field:? required}
docker images --no-trunc | sed -n "/${imageId}/s/ */ /gp" | cut -d " " -f $field
}
get-image-name() {
get-image-field $1 1
}
get-image-tag() {
get-image-field $1 2
}
save-all-images() {
local ids=$(docker images --no-trunc -q)
local name safename tag
for id in $ids; do
name=$(get-image-name $id)
tag=$(get-image-tag $id)
# Apply filter (if any)
if [[ ! -z "$filter" ]] && [[ ! "$name:$tag" =~ "$filter" ]];then
continue
fi
# Ignore stale images (tag == <none>)
if [[ "$tag" = "<none>" ]]; then
continue
fi
if [[ $name =~ / ]]; then
dir=${name%/*}
mkdir -p "$directory/$dir"
fi
echo "Saving $name:$tag ..."
if [[ $compress -eq 0 ]]; then
docker save -o "$directory/$name.$tag.tar" $name:$tag
else
docker save $name:$tag | gzip > "$directory/$name.$tag.tar.gz"
fi
done
}
load-all-images() {
local name safename noextension tag
if [[ $compress -eq 0 ]]; then
file_extension="tar"
else
file_extension="tar.gz"
fi
for image in $(find "$directory" -name \*.$file_extension); do
if [[ ! -z "$filter" ]] && [[ ! "$image" =~ "$filter" ]];then
continue
fi
echo "Loading $image ..."
docker load -i $image
done
}
case $1 in
save)
save-all-images
;;
load)
load-all-images
;;
*)
help
;;
esac
exit 0
@YannRobert

This comment has been minimized.

Copy link

commented Jan 6, 2017

@mmrko

This comment has been minimized.

Copy link
Owner Author

commented May 10, 2017

Thanks a bunch 😀 added.

@ajmulhollan1

This comment has been minimized.

Copy link

commented Jun 1, 2017

Great script thanks! :)

Worthwhile adding the following bit of information incase you come direct to this page

  • Point the Docker daemon to your Docker Machine: eval "$(docker-machine env your-docker-machine-name-goes-here)"
  • Grab the images from your Docker Machine (by running the script referred to above): ./save-load-images.sh save ./my-images
  • Unset the DOCKER env variables (which were set by the eval in step 1.)
    • unset DOCKER_TLS_VERIFY
    • unset DOCKER_CERT_PATH
    • unset DOCKER_MACHINE_NAME
    • unset DOCKER_HOST
  • Load the images into Docker for Mac: ./save-load-images.sh load ./my-images
@clijeron

This comment has been minimized.

Copy link

commented Aug 29, 2017

Thanks ! Working perfectly on my end.

@vijay-v6

This comment has been minimized.

Copy link

commented Oct 29, 2018

the script has helped me save a lot of time... thanks for that... but is there a way to modify the script to save & retag all docker images under one tar file instead of having it create & save tars in different directories?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.