#!/usr/bin/env bash # Who is PID 1, does SIGTERM reach the JVM, and how long does `docker stop` take? # -> docs/output/pid1-and-signals.txt set -uo pipefail source "$(dirname "$0")/env.sh" probe() { local tag="$1" name="sig-$$" docker rm -f "$name" > /dev/null 2>&1 docker run -d --name "$name" "sbd/docker-images:$tag" > /dev/null for _ in $(seq 1 200); do docker logs "$name" 2>&1 | grep -q 'Started ImagesApplication' && break; sleep 0.1; done local pid1 # NUL-separated argv; translate in the pipe (a shell variable cannot hold NUL bytes) pid1=$(docker exec "$name" cat /proc/1/cmdline 2>/dev/null | tr '\0' ' ') case "$pid1" in ""|*"exec failed"*) pid1="(image has no cat; ENTRYPOINT is exec form)" ;; esac local t0 t1; t0=$(date +%s%N); docker stop "$name" > /dev/null; t1=$(date +%s%N) local code; code=$(docker inspect -f '{{.State.ExitCode}}' "$name") local graceful; graceful=$(docker logs "$name" 2>&1 | grep -c 'Commencing graceful shutdown' || true) printf '%-22s PID 1: %-58s docker stop: %5d ms exit code: %-4s graceful-shutdown log lines: %s\n' \ "$tag" "${pid1:0:58}" "$(( (t1 - t0) / 1000000 ))" "$code" "$graceful" docker rm -f "$name" > /dev/null } { echo "# docker stop sends SIGTERM to PID 1, waits 10 s, then SIGKILL. Exit code 143 = the JVM handled" echo "# SIGTERM (128+15). 137 = it was killed (128+9)." echo for t in layered-jre shell-form shell-form-alpine shell-form-wrapper layered-distroless; do probe "$t"; done echo echo "# What /bin/sh is in each base image:" echo "eclipse-temurin:25-jre -> $(docker run --rm --entrypoint readlink eclipse-temurin:25-jre -f /bin/sh)" echo "eclipse-temurin:25-jre-alpine -> $(docker run --rm --entrypoint readlink eclipse-temurin:25-jre-alpine -f /bin/sh)" } | tee "$OUT/pid1-and-signals.txt"