Skip to content

Instantly share code, notes, and snippets.

@fkurz
Last active April 8, 2024 07:58
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save fkurz/d84e5117d31c2b37a69a2951561b846e to your computer and use it in GitHub Desktop.
Save fkurz/d84e5117d31c2b37a69a2951561b846e to your computer and use it in GitHub Desktop.
bash-docker-is-disk-space-usage-above-limit
#!/bin/bash
# --
# Test if Docker daemon disk space usage is above a given limit in bytes.
#
# Example 1: Docker disk space usage is above limit
#
# $ source is_docker_disk_space_usage_above_limit.sh
# $ is_docker_disk_space_usage_above_limit 1
# Docker disk space usage is above limit (actual: 1050000005B, limit: 1B)
# $ printf $?
# 0
#
# Example 2: Docker disk space usage is below or equal to limit
#
# $ source is_docker_disk_space_usage_above_limit.sh
# $ is_docker_disk_space_usage_above_limit 1000000000000
# Docker disk space usage is below or equal to limit (actual: 1050000005B, limit: 1000000000000B)
# $ printf $?
# 1
#
# --
iec_string_to_bytes() {
local iec_string=$1
iec_format_pattern='([0-9.]+)\s*([kMGTP]?B)'
if ! [[ "${iec_string}" =~ ${iec_format_pattern} ]]; then
printf "Input string has invalid format (received: \"%s\", expected: \"%s\")." "$1" "${iec_format_pattern}"
return 1
fi
local number_value="${BASH_REMATCH[1]}"
iec_unit="${BASH_REMATCH[2]}"
factor=""
case "${iec_unit}" in
B) factor=1;;
kB) factor=1000;;
MB) factor=1000000;;
GB) factor=1000000000;;
TB) factor=1000000000000;;
PB) factor=1000000000000000;;
esac
# We use scale=0 here to drop the (redundant) decimal points.
# This only works with division so we divide by one.
printf "scale=0;%s * %s/1\n" "${number_value}" "${factor}" \
| bc
}
calculate_docker_total_disk_space_usage() {
local bc_expression="0"
disk_space_used="$(docker system df --format='{{.Size}}' | tr '\n' ' ')"
for disk_space_used_by_resource in ${disk_space_used}; do
# shellcheck disable=SC2086
disk_space_used_by_resource_bytes="$(iec_string_to_bytes \"${disk_space_used_by_resource}\")"
bc_expression="${bc_expression} + ${disk_space_used_by_resource_bytes}"
done
printf "%s\n" "${bc_expression}" \
| bc
}
is_docker_disk_space_usage_above_limit() {
local disk_space_limit=$1
docker_disk_space_used="$(calculate_docker_total_disk_space_usage)"
docker_disk_space_usage_is_above_limit="$(printf '%s > %s\n' ${docker_disk_space_used} ${disk_space_limit} | bc -l)"
# Note that bc returns 1 if the comparison is true and 0 otherwise.
if [ "${docker_disk_space_usage_is_above_limit}" -eq 1 ]; then
printf "Docker disk space usage is above limit (actual: %sB, limit: %sB)" "${docker_disk_space_used}" "${disk_space_limit}"
return 0
fi
printf "Docker disk space usage is below or equal to limit (actual: %sB, limit: %sB)" "${docker_disk_space_used}" "${disk_space_limit}"
return 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment