Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
This script cleans the Docker.qcow2 file that takes a lot of disk space with Docker For Mac. You can specify some Docker images that you would like to keep.
#!/bin/bash
# Copyright 2017 Théo Chamley
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in the Software
# without restriction, including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
# to whom the Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all copies or
# substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
IMAGES=$@
echo "This will remove all your current containers and images except for:"
echo ${IMAGES}
read -p "Are you sure? [yes/NO] " -n 1 -r
echo # (optional) move to a new line
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
exit 1
fi
TMP_DIR=$(mktemp -d)
pushd $TMP_DIR >/dev/null
open -a Docker
echo "=> Saving the specified images"
for image in ${IMAGES}; do
echo "==> Saving ${image}"
tar=$(echo -n ${image} | base64)
docker save -o ${tar}.tar ${image}
echo "==> Done."
done
echo "=> Cleaning up"
echo -n "==> Quiting Docker"
osascript -e 'quit app "Docker"'
while docker info >/dev/null 2>&1; do
echo -n "."
sleep 1
done;
echo ""
echo "==> Removing Docker.qcow2 file"
rm ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
echo "==> Launching Docker"
open -a Docker
echo -n "==> Waiting for Docker to start"
until docker info >/dev/null 2>&1; do
echo -n "."
sleep 1
done;
echo ""
echo "=> Done."
echo "=> Loading saved images"
for image in ${IMAGES}; do
echo "==> Loading ${image}"
tar=$(echo -n ${image} | base64)
docker load -q -i ${tar}.tar || exit 1
echo "==> Done."
done
popd >/dev/null
rm -r ${TMP_DIR}
@cmourouvin

This comment has been minimized.

Copy link

@cmourouvin cmourouvin commented Dec 22, 2016

Thanks. Worked well 👍

@wpdejin

This comment has been minimized.

Copy link

@wpdejin wpdejin commented Jul 13, 2017

Thanks

@blacknred0

This comment has been minimized.

Copy link

@blacknred0 blacknred0 commented Aug 30, 2017

beautiful!!! Thanks

@davidbonachera

This comment has been minimized.

Copy link

@davidbonachera davidbonachera commented Sep 22, 2017

Awesome script ! Thanks. 🥇

@hugocaillard

This comment has been minimized.

Copy link

@hugocaillard hugocaillard commented Feb 16, 2018

It looks like Docker.qcow2 has been renamed to Docker.raw.
If so, line 53 has to be changed to

rm ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.raw
@qiuhuaqi

This comment has been minimized.

Copy link

@qiuhuaqi qiuhuaqi commented Mar 5, 2018

@hugocaillard You sure? It's still Docker.qcow2 for me. I'm on MacBook Air Early 2015 High Serria with the latest Docker Version 17.12.0-ce-mac55 (23011).
Looks like Docker uses Docker.raw if you run on macOS High Serria with APFS enabled. Otherwise it'll stick with qcow2. (Mentioned in this FAQ)

@blacknred0

This comment has been minimized.

Copy link

@blacknred0 blacknred0 commented Dec 4, 2019

👍

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.