Docker relies on the Cgroup implementation of The Linux system. When running in the MAC system, Docker will start the Linux kernel in a VIRTUAL machine and put a disk image file in qcow2 format on the hard disk. The file expands with Docker usage, even if you delete unused Docker images and containers. After testing an automated tool for Dockerfile rewriting, the docker.qcow2 file reached 42GB.
A Google search on Score found that a Frenchman named Theo Chamley had written a script to free up space for the docker.qcow2 file. The basic principle is to use docker save command to save the image to be retained, then close docker, delete docker.qcow2, and then start Docker, which will automatically rebuild, and finally use docker load command to restore the image to be retained.
Here’s the script the guy wrote.
#! /bin/bash # Copyright 2017 Theo Chamley # Permission is hereby granted, 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}Copy the code
Theo Chamley’s original blog post