From 4885f0bd3b6d864d49dc961af431a20640b79d3b Mon Sep 17 00:00:00 2001 From: Tianon Gravi Date: Sun, 26 Oct 2014 03:06:23 -0600 Subject: [PATCH] Add "VSize" to "Supported tags and respective `Dockerfile` links" --- generate-dockerfile-links-partial.sh | 8 ++- get-image-data.sh | 97 ++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100755 get-image-data.sh diff --git a/generate-dockerfile-links-partial.sh b/generate-dockerfile-links-partial.sh index 7b3bee765fee..53792d9e611c 100755 --- a/generate-dockerfile-links-partial.sh +++ b/generate-dockerfile-links-partial.sh @@ -1,6 +1,8 @@ #!/bin/bash set -e +thisDir="$(dirname "$(readlink -f "$BASH_SOURCE")")" + repo="$1" if [ -z "$repo" ]; then echo >&2 "usage: $0 repo" @@ -14,6 +16,7 @@ unset IFS repoDirs=() declare -A repoDirTags=() +declare -A repoDirFirstTag=() for line in "${lines[@]}"; do tag="$(echo "$line" | awk -F ': +' '{ print $1 }')" @@ -24,6 +27,9 @@ for line in "${lines[@]}"; do repoDirTags["$repoDir"]+=', ' fi repoDirTags["$repoDir"]+='`'"$tag"'`' + if [ -z "${repoDirFirstTag[$repoDir]}" ]; then + repoDirFirstTag["$repoDir"]="$tag" + fi done for repoDir in "${repoDirs[@]}"; do @@ -51,7 +57,7 @@ for repoDir in "${repoDirs[@]}"; do url="https://$gitUrl/blob/$commit/${dir}Dockerfile" - echo '- ['"${repoDirTags["$repoDir"]}"' (*'"${dir}Dockerfile"'*)]('"$url"')' + echo '- ['"${repoDirTags["$repoDir"]}"' (*'"${dir}Dockerfile"'*)]('"$url"') [VSize: '"$("$thisDir/get-image-data.sh" vsize "$repo" "${repoDirFirstTag["$repoDir"]}")"']' done echo diff --git a/get-image-data.sh b/get-image-data.sh new file mode 100755 index 000000000000..c05c6910f65a --- /dev/null +++ b/get-image-data.sh @@ -0,0 +1,97 @@ +#!/bin/bash +set -e + +usage() { + echo "usage: $0 [options] data image [tag]" + echo " ie: $0 vsize scratch" + echo " $0 id debian latest" + echo " $0 -v vsize golang cross" +} + +opts="$(getopt -o 'h?v' --long 'help,verbose' -- "$@" || { usage >&2 && false; })" +eval set -- "$opts" + +verbose= +while true; do + flag="$1" + shift + case "$flag" in + --help|-h|'-?') + usage + exit 0 + ;; + --verbose|-v) verbose=1 ;; + --) + break + ;; + *) + { + echo "error: unknown flag: $flag" + usage + } >&2 + exit 1 + ;; + esac +done + +data="$1" +image="$2" +tag="${3:-latest}" + +if [ -z "$data" -o -z "$image" -o -z "$tag" ]; then + usage >&2 + exit 1 +fi + +humanSizeUnits=( B KB MB GB TB ) +[ "$verbose" ] && humanSizeScale=3 || humanSizeScale=1 +human_size() { + bytes="$1" + unit=0 + unitBytes="$1" + while unitBytes="$(echo "scale=0; $bytes / (1000 ^ $unit)" | bc -l)" && [ "$unitBytes" -gt 1000 ]; do + if [ ! "${humanSizeUnits[$(( unit + 1 ))]}" ]; then + break + fi + unit="$(( unit + 1 ))" + done + echo "$(echo "scale=$humanSizeScale; $bytes / (1000 ^ $unit)" | bc -l) ${humanSizeUnits[$unit]}" +} + +token="$(curl -sSL -o /dev/null -D- -H 'X-Docker-Token: true' "https://index.docker.io/v1/repositories/$image/images" | awk -F ':[[:space:]]*|\r' '$1 == "X-Docker-Token" { print $2 }')" + +imageId="$(curl -sSL -H "Authorization: Token $token" "https://registry-1.docker.io/v1/repositories/$image/tags/$tag")" +imageId="${imageId%\"}" +imageId="${imageId#\"}" + +case "$data" in + id) + echo "$imageId" + ;; + vsize) + total="$(docker inspect -f '{{printf "%.0f" .VirtualSize}}' "$imageId" 2>/dev/null || true)" + if [ "$total" ]; then + echo "$(human_size $total)" + exit + fi + + ancestry=( $(curl -sSL -H "Authorization: Token $token" "https://registry-1.docker.io/v1/images/$imageId/ancestry" | sed -r 's/^\["|"\]//g; s/",[[:space:]]*"/ /g') ) + + total=0 + for ancestor in "${ancestry[@]}"; do + size="$(curl -sSL -H "Authorization: Token $token" "https://registry-1.docker.io/v1/images/$ancestor/json" | awk -F '"Size":[[:space:]]*' '{ sub(/(,|}).*/, "", $2); if ($2 == "") { print 0 } else { print $2 } }')" + total="$(echo "$total + $size" | bc)" + if [ "$verbose" ]; then + echo "${ancestor:0:12}: $(human_size $size)" + fi + done + if [ "$verbose" ]; then + echo -n 'total: ' + fi + echo "$(human_size $total)" + ;; + *) + echo >&2 "unknown data type requested: $data" + exit 1 + ;; +esac