From 7c4409714028c15c81cb0e3284faf588526d2ebb Mon Sep 17 00:00:00 2001 From: Bilal Godil Date: Mon, 13 Apr 2026 10:19:40 -0700 Subject: [PATCH] emulator: replace docker save/nuke/reload with in-place prune After flattening, reclaim intermediate layers with `docker rmi` + `docker image prune -af` rather than round-tripping the final image through a tar and wiping /var/lib/docker. The round-trip cost ~15 min under same-arch TCG on the arm64 runner because every byte of the image is read, written to tar, then read and written back. Relies on the drive's `discard=on,detect-zeroes=unmap` + fstrim to return freed clusters to the qcow2, which also lets the zero-fill `dd` go. --- .../qemu/cloud-init/emulator/user-data | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/docker/local-emulator/qemu/cloud-init/emulator/user-data b/docker/local-emulator/qemu/cloud-init/emulator/user-data index c1d0d0f9b..ad70bdc8d 100644 --- a/docker/local-emulator/qemu/cloud-init/emulator/user-data +++ b/docker/local-emulator/qemu/cloud-init/emulator/user-data @@ -399,28 +399,16 @@ write_files: - stack-local-emulator:final log "Flatten done." - log "Saving final image to /var/tmp..." + log "Pruning intermediate images in place..." docker rm flatten - docker save stack-local-emulator:final -o /var/tmp/final-image.tar - mv /var/lib/docker/volumes /var/tmp/volumes-backup - log "Nuking Docker storage and reloading..." - systemctl stop docker containerd - rm -rf /var/lib/docker /var/lib/containerd - systemctl start docker containerd - until docker info >/dev/null 2>&1; do sleep 1; done - docker load -i /var/tmp/final-image.tar + docker rmi stack-local-emulator stack-local-emulator-slim || true docker tag stack-local-emulator:final stack-local-emulator docker rmi stack-local-emulator:final || true - rm -f /var/tmp/final-image.tar - systemctl stop docker - rm -rf /var/lib/docker/volumes - mv /var/tmp/volumes-backup /var/lib/docker/volumes - systemctl start docker - log "Docker storage rebuilt." + docker builder prune -af || true + docker image prune -af || true + log "Intermediate images pruned." - log "Zeroing free space for qcow2 compression..." - dd if=/dev/zero of=/zero.fill bs=1M 2>/dev/null || true - rm -f /zero.fill + log "Releasing free space for qcow2 compression (fstrim)..." sync fstrim -av 2>/dev/null || true log "slim-docker-image done."