Skip to content

v1.6.0

Choose a tag to compare

@github-actions github-actions released this 26 May 13:23
· 43 commits to main since this release

Added

  • group_add field in stack.yaml — adds supplementary GIDs to the container process without changing the user or primary group. Accepts a list of group IDs or names (e.g. ["1500", "docker"]). Changes are included in the config hash and trigger recreation on apply.
  • exec <name> [command...] — run a command inside a running container. Defaults to /bin/sh. Allocates a PTY and sets raw terminal mode when stdin is a terminal; window resize is forwarded automatically. Non-TTY invocations (piped stdin) run without a PTY.
  • start --follow and restart --follow stream container logs immediately after the container is running. Requires a single container name (not compatible with --all or multiple names).
  • check-update --follow streams logs after --apply completes for a single container. Requires both --apply and exactly one container name argument.
  • images [--unused] — list all local images with tags, size, age, and attached container names. --unused filters to images not referenced by any running container or stack declaration. -o json|yaml includes per-image container list with name and state.
  • volumes [--unused] [--size] — list local volumes with driver and attached containers. --unused filters to dangling (unmounted) volumes. --size fetches disk usage via the daemon's disk-usage endpoint (triggers a daemon-side scan) and adds a SIZE column; in JSON/YAML the size is in bytes (-1 when the driver does not report). -o json|yaml additionally includes the host mountpoint and per-container mount details (source, destination, read_only).
  • networks [--unused] — list user-defined networks (system networks bridge, host, none are excluded). --unused filters to networks not connected to any container. -o json|yaml includes per-network container list with IP address and gateway. The MANAGED column indicates networks created by containerctl.
  • prune [--images] [--volumes] [--networks] [--all] [--dry-run] [--force] — remove unused local resources. At least one resource type must be selected; --all is equivalent to --images --volumes --networks. --dry-run previews what would be removed without acting. When stdin is not a terminal, --force is required to prevent accidental deletion in scripts.
  • status -o json|yaml now includes networks (name, ip_address, gateway) and mounts (type, name, source, destination, read_only) for each container. Tmpfs mounts are excluded. These fields are omitted from the text table output.

Changed

  • All JSON output is now indented with 2 spaces for readability (previously compact single-line).
  • All YAML output uses 2-space indentation consistently across all commands.
  • volumes -o json|yaml includes the host mountpoint path and an optional size field (populated only when --size is passed).
  • networks -o json|yaml fields are now consistently snake_case with explicit JSON tags (id, name, driver, labels).
  • ListContainers now populates full mount details (ContainerMount: type, name, source, destination, read_only) and network details (ContainerNetworkInfo: name, ip_address, gateway) instead of plain string slices. This powers the enriched JSON output across status, volumes, networks, and images.

Fixed

  • exec no longer leaves the terminal in raw mode (invisible input) after the container exits with a non-zero code. os.Exit bypasses deferred functions; the terminal state is now restored explicitly before exit.
  • serve browser terminal no longer shows a double prompt after a blocked or unrecognised command. The error message handler no longer calls writePrompt() — the done message that always follows handles the prompt.
  • volumes -o json no longer silently omits the size field for empty volumes. Changed from int64 with omitempty (which drops 0) to *int64 — nil means not fetched (omitted), 0 means genuinely empty, -1 means driver does not report.
  • prune --images no longer marks images that are actively used by running containers as candidates for removal. Image matching now uses the short 12-character image ID from the container's ImageID field as the primary check, with tag name as a fallback.