Files
2026-11-09 08:20:57 +00:00

58 lines
7.2 KiB
Markdown

# Container Compose 0.2.0
One native macOS Xcode app combining the existing AppleContainerCompose orchestration engine and the supplied **ACDry Swift 1.1.0** monitor, with one **container-compose** CLI. Requires Apple silicon, macOS 26+, Xcode 26+ and Apple's `container` runtime. No Docker daemon, Go or Python is required to run it. Xcode fetches Yams for YAML parsing; Python 3 is used only by CLI tests.
## Build
Open `ContainerCompose.xcodeproj`, choose **ContainerCompose**, and Run. The **Container Compose.app** product includes `container-compose` in Contents/MacOS. Choose **Save Command-Line Tool…** in the application menu to export it. Alternatively run `./Scripts/install-cli.sh` to build and install the CLI into `/opt/homebrew/bin`; override `PREFIX` if desired. The installer uses a fresh temporary build directory and preserves old accompose/acdry installations.
The **Compose** tab opens existing compose.yaml/docker-compose.yml files and exposes Up, Down, Restart, Status, Logs, Pull, Build and runtime diagnostics. GUI Up is detached. The **Monitor & Resources** tab supplies the acdry dashboard, Containers, Images, Networks, Volumes and Projects. Opening YAML supplies its project name to monitoring. Resource lists remain runtime-wide unless the Projects filter applies. The executable selected in Settings is shared by both GUI engines. CLI discovery uses PATH and Homebrew fallback locations.
Monitor features retained: CPU/memory/network charts, six-minute in-memory history, measured receive/transmit rates, freshness indicators, searchable resource lists, inspect, polling logs with follow, stats, processes, verified lifecycle actions, explicit deletion/prune confirmations, mount references and inspect-only host mounts, keyboard shortcuts, and read-only demo mode. Disk read/write totals appear in container lists and Stats when the runtime provides them. Volume capacity is provisioned size, not occupied space. Process inspection needs `ps` inside the image. There is no fabricated live telemetry when metrics are absent.
## CLI
```sh
container-compose --help
container-compose doctor
container-compose -f compose.yaml config
container-compose -vvv up -d # returns after startup
container-compose up # streams logs; Ctrl+C gracefully stops services
container-compose up --build -d
container-compose logs [SERVICE] # snapshot
container-compose start|stop|restart [SERVICE]
container-compose exec web sh # interactive terminal when invoked from a terminal
container-compose down # preserves named volumes
container-compose down --volumes
container-compose clean --all --dry-run
container-compose import ./docker-compose.yml
container-compose monitor --help
container-compose monitor watch
container-compose monitor --demo watch --json --count 2
container-compose monitor stats
container-compose monitor logs --follow CONTAINER
container-compose monitor volumes --all-mounts
container-compose monitor volume create -s 1G data
container-compose monitor projects
```
The monitor namespace retains acdry's CLI commands, including resource inspection, lifecycle, image/network/volume commands, live terminal monitoring and streaming logs. Its global options (`--container PATH`, `--project NAME`, `--demo`) precede its subcommand. Compose service commands and monitor container-ID commands are separate; use `monitor --help` for exact syntax. Resource prune in this namespace requires `--yes` and affects all unused resources of the chosen type.
`up -d`/`--detach` and verbosity `-v`/`-vv`/`-vvv` remain independent; options work before/after up. Foreground SIGINT/SIGTERM stops reached services in reverse dependency order and preserves containers. A log follower error is reported, and may leave containers running. Existing stopped containers are started; changed configuration requires down/up. Concurrent external runtime changes are not reconciled. Multiple foreground service logs share the terminal without prefixes.
## Compose compatibility and gaps
This is a developer preview with **partial Compose support**, not Docker Compose parity. Supported: YAML service images, Dockerfile build contexts/dockerfile/build args, short ports and volume mounts, environment list/mapping, `.env`/`${VAR}` interpolation, command, working_dir, dependency ordering and project-scoped names. Empty named-volume and custom-network declarations, plus explicit default local/bridge drivers, are supported. YAML anchors handled by Yams may work, but Compose extension/merge semantics are not implemented. Treat config as validation plus original YAML, not canonical expanded Docker Compose output.
Unimplemented in this app: profiles, scaling, multi-file merge, include/extends, env_file, healthchecks and health/completion dependency gating, secrets/configs, deploy, watch/rebuild reconciliation, wait, one-off run, cp, events, publish/push, robust Docker shell parsing/interpolation, long port/mount syntax, network attachment options/aliases, external/custom resource names and driver/IPAM configuration. These require further implementation; they are not all Apple runtime limitations. Unknown service/root fields and several unsupported nested options are rejected before runtime changes. Restart policies only produce a warning and have no supervisor. Multiple service networks only attach the first, with a warning. `ps` lists the whole runtime. Compose `logs` is a snapshot; use `monitor logs --follow ID` for streaming outside foreground up.
Apple-runtime differences: this app uses Apple's CLI and per-container Linux VMs, not Docker Engine's API/socket; Docker-socket-dependent tools and Docker Swarm features are not provided. Runtime flags, networking/DNS, image architecture and storage behavior differ from Docker. Do not assume bare Compose service-name DNS works. See Apple's [command reference](https://github.com/apple/container/blob/main/docs/command-reference.md), [technical overview](https://github.com/apple/container/blob/main/docs/technical-overview.md) and [networking guide](https://github.com/apple/container/blob/main/docs/networking.md). Runtime-supported features still need explicit translation in this app.
Bind mounts can create a missing source as a directory; create file bind sources yourself first. Down/clean remove managed containers based on project/service names; verify project names before use. Down --volumes deletes project named-volume data. Host mount files are never deleted by cleanup. Build/install does not automatically start or configure the runtime/kernel.
## Source provenance and validation
Compose source: local AppleContainerCompose-Laravel-Fixed, matching the development checkout's ComposeCore. Monitor source: uploaded `ACDry-Swift-1.1.0.zip`, whose 14 source-package files matched the recovered local 1.1.0 release byte-for-byte before integration. The earlier acdry.zip contained an empty README and Git metadata only. Original projects and archives were preserved. The recovered monitor's MIT license is in ACDry-LICENSE. No upstream Dry Go code is included.
See VALIDATION.md for results and reproduction. The Xcode project is the complete app/CLI build. Package.swift exposes only the monitor-core regression tests. The deliverable is source; local builds require your own signing/notarization for distribution.