-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathdocker_efficiency.sh
executable file
·59 lines (45 loc) · 2.23 KB
/
docker_efficiency.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/bin/bash
set -e
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
cd "$(dirname "$0")"
for cmd in bc docker grep jq sed xargs; do
! which "$cmd" >/dev/null || continue
printf '\033[31m[ERROR] Missing command "%s".\033[0m\n' "$cmd" >&2
exit 1
done
sudo_docker="$([ -w '/var/run/docker.sock' ] || ! which sudo >/dev/null || echo 'sudo --preserve-env=DOCKER_BUILDKIT') docker"
[ "$DOCKER_IMAGE" ] || DOCKER_IMAGE="$@"
[ "$DOCKER_IMAGE" ] || DOCKER_IMAGE='roasterproject/centos roasterproject/debian roasterproject/ubuntu'
DOCKER_IMAGE="$(sed 's/[[:space:]][[:space:]]*/ /g' <<< "$DOCKER_IMAGE" | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$//')"
[ "$DOCKER_IMAGE" ]
[ "$DIR" ] || DIR='/'
if grep '[[:space:]]' <<< "$DOCKER_IMAGE" >/dev/null; then
xargs -n1 "./$(basename "$0")" <<< "$DOCKER_IMAGE" | column -t
exit 0
fi
image_size="$(set -e;
$sudo_docker inspect "$DOCKER_IMAGE" \
| jq -er '.[].Size'
)"
image_size="$(set -e;
$sudo_docker run --rm -i --entrypoint '' "$DOCKER_IMAGE" bash -c "du --exclude=/{dev,proc} -B1 -cs '$DIR'" \
| tail -n1 \
| cut -f1
)"
layer_size="$(set -e;
$sudo_docker inspect "$DOCKER_IMAGE" \
| jq -er '.[].GraphDriver.Data.LowerDir + ":" + .[].GraphDriver.Data.UpperDir' \
| grep -v null \
| xargs -d: -n1 \
| grep '.' \
| sed 's/$/'"$(sed 's/\([\\\/\.\-]\)/\\\1/g' <<< "$DIR")"'/' \
| paste -s - \
| sudo xargs -L1 du -B1 -cs 2>/dev/null \
| tail -n1 \
| cut -f1
)"
[ "$image_size" -gt 0 ]
[ "$layer_size" -gt 0 ]
bc -l <<< "100.0 * $image_size / $layer_size" \
| xargs -rI{} printf '\033[36m[INFO] Space efficiency %.1f%% for "%s" in "%s".\033[0m\n' {} "$DIR" "$DOCKER_IMAGE" >&2
trap - SIGTERM SIGINT EXIT