-
-
Save kwk/c5443f2a1abcf0eb1eaa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
JQPATH=$(which jq) | |
if [ "x$JQPATH" == "x" ]; then | |
echo "Couldn't find jq executable." 1>&2 | |
exit 2 | |
fi | |
set -eu | |
shopt -s nullglob | |
readonly base_dir=/var/lib/docker/registry | |
readonly output_dir=$(mktemp -d -t trace-images-XXXX) | |
readonly jq=$JQPATH | |
readonly repository_dir=$base_dir/repositories | |
readonly image_dir=$base_dir/images | |
readonly all_images=$output_dir/all | |
readonly used_images=$output_dir/used | |
readonly unused_images=$output_dir/unused | |
function info() { | |
echo -e "\nArtifacts available in $output_dir" | |
} | |
trap info EXIT ERR INT | |
function image_history() { | |
local readonly image_hash=$1 | |
$jq '.[]' $image_dir/$image_hash/ancestry | tr -d '"' | |
} | |
echo "Collecting orphan images" | |
for library in $repository_dir/*; do | |
echo "Library $(basename $library)" >&2 | |
for repo in $library/*; do | |
echo " Repo $(basename $repo)" >&2 | |
for tag in $repo/tag_*; do | |
echo " Tag $(basename $tag)" >&2 | |
tagged_image=$(cat $tag) | |
image_history $tagged_image | |
done | |
done | |
done | sort | uniq > $used_images | |
ls $image_dir > $all_images | |
grep -v -F -f $used_images $all_images > $unused_images | |
readonly all_image_count=$(wc -l $all_images | awk '{print $1}') | |
readonly used_image_count=$(wc -l $used_images | awk '{print $1}') | |
readonly unused_image_count=$(wc -l $unused_images | awk '{print $1}') | |
readonly unused_image_size=$(cd $image_dir; du -hc $(cat $unused_images) | tail -n1 | cut -f1) | |
echo "${all_image_count} images, ${used_image_count} used, ${unused_image_count} unused" | |
echo "Unused images consume ${unused_image_size}" | |
echo -e "\nTrimming _index_images..." | |
readonly unused_images_flatten=$output_dir/unused.flatten | |
cat $unused_images | sed -e 's/\(.*\)/\"\1\" /' | tr -d "\n" > $unused_images_flatten | |
for library in $repository_dir/*; do | |
echo "Library $(basename $library)" >&2 | |
for repo in $library/*; do | |
echo " Repo $(basename $repo)" >&2 | |
mkdir -p "$output_dir/$(basename $repo)" | |
jq '.' "$repo/_index_images" > "$output_dir/$(basename $repo)/_index_images.old" | |
jq -s '.[0] - [ .[1:][] | {id: .} ]' "$repo/_index_images" $unused_images_flatten > "$output_dir/$(basename $repo)/_index_images" | |
cp "$output_dir/$(basename $repo)/_index_images" "$repo/_index_images" | |
done | |
done | |
echo -e "\nRemoving images" | |
cat $unused_images | xargs -I{} rm -rf $image_dir/{} |
I think I figured it out -- I downgraded to jq 1.4 and the script works now. Nevermind!
There's a script that works with registry v2 at https://github.com/burnettk/delete-docker-registry-image.
Thanks for this! Saved me a lot of work. I've created a fork that has a test option that is non-destructive.
https://gist.github.com/smiskiewicz1/32d8a5db0ab743ff2accebf8c988cd21
@smiskiewicz1
will it wok with registry v2?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'm seeing these errors when I try to run this script:
My jq version is 1.5, is that a problem?