Remove old images by ID after container updates, not just dangling prune
Tagged images are never caught by docker image prune -f. Collect OLD_IDs during the pull loop and explicitly rmi them after rebuilds complete.
This commit is contained in:
@@ -257,6 +257,7 @@ START=$(date +%s)
|
|||||||
UPDATED=()
|
UPDATED=()
|
||||||
UP_TO_DATE=()
|
UP_TO_DATE=()
|
||||||
FAILED=()
|
FAILED=()
|
||||||
|
OLD_IMAGE_IDS=() # old image IDs to explicitly remove after rebuilds
|
||||||
SKIPPED=()
|
SKIPPED=()
|
||||||
|
|
||||||
for container in "${TARGET_CONTAINERS[@]}"; do
|
for container in "${TARGET_CONTAINERS[@]}"; do
|
||||||
@@ -301,6 +302,7 @@ for container in "${TARGET_CONTAINERS[@]}"; do
|
|||||||
if [[ -n "$OLD_ID" ]] && [[ "$OLD_ID" != "$NEW_ID" ]]; then
|
if [[ -n "$OLD_ID" ]] && [[ "$OLD_ID" != "$NEW_ID" ]]; then
|
||||||
log "$ICON_DONE $container — updated ✅ (${OLD_ID:7:12} → ${NEW_ID:7:12})"
|
log "$ICON_DONE $container — updated ✅ (${OLD_ID:7:12} → ${NEW_ID:7:12})"
|
||||||
UPDATED+=("$container")
|
UPDATED+=("$container")
|
||||||
|
OLD_IMAGE_IDS+=("$OLD_ID")
|
||||||
else
|
else
|
||||||
log "$container — already up to date (${NEW_ID:7:12})"
|
log "$container — already up to date (${NEW_ID:7:12})"
|
||||||
UP_TO_DATE+=("$container")
|
UP_TO_DATE+=("$container")
|
||||||
@@ -338,13 +340,17 @@ if [[ ${#UPDATED[@]} -gt 0 ]]; then
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── Prune dangling images ─────────────────────────────────────────────────────
|
# ── Remove old images ────────────────────────────────────────────────────────
|
||||||
# Old images become dangling after a pull lands a new digest. Prune here so
|
# Explicitly rmi by the IDs captured before each pull. Tagged images are never
|
||||||
# they don't accumulate across daily runs.
|
# caught by dangling-only prune, so this is the only reliable cleanup path.
|
||||||
|
# Fall through to dangling prune to catch any leftovers from other update paths.
|
||||||
if [[ "$DRY_RUN" == true ]]; then
|
if [[ "$DRY_RUN" == true ]]; then
|
||||||
warn "DRY RUN — would prune dangling images"
|
warn "DRY RUN — would remove ${#OLD_IMAGE_IDS[@]} old image(s) and prune dangling"
|
||||||
PRUNED_SUMMARY="(dry run)"
|
PRUNED_SUMMARY="(dry run)"
|
||||||
else
|
else
|
||||||
|
for _old_id in "${OLD_IMAGE_IDS[@]}"; do
|
||||||
|
docker rmi "$_old_id" >/dev/null 2>&1 || true
|
||||||
|
done
|
||||||
PRUNED_OUTPUT=$(docker image prune -f 2>&1)
|
PRUNED_OUTPUT=$(docker image prune -f 2>&1)
|
||||||
[[ "$ENABLE_LOGGING" == "true" ]] && echo "$PRUNED_OUTPUT" | sed 's/^/ /'
|
[[ "$ENABLE_LOGGING" == "true" ]] && echo "$PRUNED_OUTPUT" | sed 's/^/ /'
|
||||||
PRUNED_SUMMARY=$(echo "$PRUNED_OUTPUT" | grep -E "^Total reclaimed" || echo "nothing reclaimed")
|
PRUNED_SUMMARY=$(echo "$PRUNED_OUTPUT" | grep -E "^Total reclaimed" || echo "nothing reclaimed")
|
||||||
|
|||||||
@@ -166,6 +166,7 @@ START=$(date +%s)
|
|||||||
UPDATED=()
|
UPDATED=()
|
||||||
UP_TO_DATE=()
|
UP_TO_DATE=()
|
||||||
FAILED=()
|
FAILED=()
|
||||||
|
OLD_IMAGE_IDS=()
|
||||||
|
|
||||||
for container in "${REMAINING[@]}"; do
|
for container in "${REMAINING[@]}"; do
|
||||||
[[ -z "$container" ]] && continue
|
[[ -z "$container" ]] && continue
|
||||||
@@ -202,6 +203,7 @@ for container in "${REMAINING[@]}"; do
|
|||||||
if [[ -n "$OLD_ID" ]] && [[ "$OLD_ID" != "$NEW_ID" ]]; then
|
if [[ -n "$OLD_ID" ]] && [[ "$OLD_ID" != "$NEW_ID" ]]; then
|
||||||
log "$ICON_DONE $container — updated ✅ (${OLD_ID:7:12} → ${NEW_ID:7:12})"
|
log "$ICON_DONE $container — updated ✅ (${OLD_ID:7:12} → ${NEW_ID:7:12})"
|
||||||
UPDATED+=("$container")
|
UPDATED+=("$container")
|
||||||
|
OLD_IMAGE_IDS+=("$OLD_ID")
|
||||||
else
|
else
|
||||||
log "$container — already up to date (${NEW_ID:7:12})"
|
log "$container — already up to date (${NEW_ID:7:12})"
|
||||||
UP_TO_DATE+=("$container")
|
UP_TO_DATE+=("$container")
|
||||||
@@ -269,9 +271,12 @@ echo ""
|
|||||||
echo "━━━ $ICON_SYNC Pruning Dangling Images — $(date '+%Y-%m-%d %H:%M:%S') ━━━"
|
echo "━━━ $ICON_SYNC Pruning Dangling Images — $(date '+%Y-%m-%d %H:%M:%S') ━━━"
|
||||||
|
|
||||||
if [[ "$DRY_RUN" == true ]]; then
|
if [[ "$DRY_RUN" == true ]]; then
|
||||||
warn "DRY RUN — would prune dangling images"
|
warn "DRY RUN — would remove ${#OLD_IMAGE_IDS[@]} old image(s) and prune dangling"
|
||||||
PRUNED_SUMMARY="(dry run)"
|
PRUNED_SUMMARY="(dry run)"
|
||||||
else
|
else
|
||||||
|
for _old_id in "${OLD_IMAGE_IDS[@]}"; do
|
||||||
|
docker rmi "$_old_id" >/dev/null 2>&1 || true
|
||||||
|
done
|
||||||
PRUNED_OUTPUT=$(docker image prune -f 2>&1)
|
PRUNED_OUTPUT=$(docker image prune -f 2>&1)
|
||||||
[[ "$ENABLE_LOGGING" == "true" ]] && echo "$PRUNED_OUTPUT" | sed 's/^/ /'
|
[[ "$ENABLE_LOGGING" == "true" ]] && echo "$PRUNED_OUTPUT" | sed 's/^/ /'
|
||||||
PRUNED_SUMMARY=$(echo "$PRUNED_OUTPUT" | grep -E "^Total reclaimed" || echo "nothing reclaimed")
|
PRUNED_SUMMARY=$(echo "$PRUNED_OUTPUT" | grep -E "^Total reclaimed" || echo "nothing reclaimed")
|
||||||
|
|||||||
Reference in New Issue
Block a user