Skip to content

v0.8.0

Latest

Choose a tag to compare

@zw008 zw008 released this 03 Aug 05:46

Fixed

  • The image-prune preview no longer promises space it cannot free. reclaimableBytes summed each dangling image's total Size, which includes the base layers a still-tagged image holds too — on a real Docker 29.1.3 the preview offered 11.0 MiB where the prune freed 1.6 KiB. It now subtracts SharedSize, read from an unfiltered listing (Docker computes sharing against the images it returns, so a dangling-only listing reports SharedSize: 0 for everything and the subtraction would do nothing), and the result is labelled reclaimableIsUpperBound — layers still held by a container or the build cache survive the prune, so the exact figure is only known afterwards from spaceReclaimedBytes.
  • One pruned image is reported as one. Docker's prune response carries an entry per action, so removing a single image yields both Untagged and Deleted for the same id and deletedCount said 2.
  • The CLI exited 0 for a refused or failed write. manage printed the governed twin's {"error": ...} payload and returned success, so nothing reading the exit status could tell a refusal from a completed write — while the --dry-run path already exited 1, making the preview stricter than the write it previews. Every manage result now goes through checked(): error → exit 1, undetermined → exit 2. Caught live against a real Portainer 2.39.5 by asking it to stop the Portainer container it proxies through (the self-lockout guard refused correctly; the exit code said otherwise). Same class already fixed in proxmox-, xcpng-, veeam- and truenas-aiops.
  • undo apply replays against the target the original write ran on. It dispatched the inverse against whatever target the caller named — in practice the config's first entry — while the write's own target sat unused in the undo record. On a multi-target config the inverse therefore ran against the wrong host; it only looks harmless because the resource usually is not there, but two hosts holding the same name and the inverse succeeds on the wrong one, silently. An explicitly named target still wins. Line-wide: all 24 copies had the identical defect. Caught live in container-host-aiops, where a stop recorded against a Podman target replayed against a Portainer one.