Skip to content

Instantly share code, notes, and snippets.

@MrTrustor
Last active November 21, 2023 11:38
Show Gist options
  • Save MrTrustor/e690ba75cefe844086f5e7da909b35ce to your computer and use it in GitHub Desktop.
Save MrTrustor/e690ba75cefe844086f5e7da909b35ce to your computer and use it in GitHub Desktop.
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}
@davidbonachera
Copy link

Awesome script ! Thanks. 🥇

@hugocaillard
Copy link

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
Copy link

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
Copy link

👍

@tyanyaw
Copy link

tyanyaw commented Sep 2, 2023

Modify for "Docker.raw" version, and beautify it.
~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw

clean-docker-for-mac.sh

@Bat-Sheva-Sh
Copy link

Bat-Sheva-Sh commented Oct 12, 2023

where can i run this script if i'm on windows and i use wsl2 for ubuntu?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment