Last active
April 8, 2024 07:58
-
-
Save fkurz/d84e5117d31c2b37a69a2951561b846e to your computer and use it in GitHub Desktop.
bash-docker-is-disk-space-usage-above-limit
This file contains hidden or 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 | |
# -- | |
# 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