Releases: debeski/composer
Releases · debeski/composer
v1.1.4
runSubcommand: Addedcomposer run [-m] [-s] [-F] [-f FILE] [-d] <service> <command...>to run a command inside a Compose service without hand-writingdocker exec/docker run. Defaults todocker compose exec <service> <command...>;-m/--manageprependspython manage.py,-s/--shellwraps the command insh -c,-F/--freshswitches to a one-offdocker compose run --rm. TTY is auto-managed (-Tadded when stdin/stdout aren't a terminal). Implemented as an earlyargv[1] == "run"intercept inDockerComposeLauncher.run()→handle_run()→DockerComposeMixin.exec_in_service(), with a newSubprocessRunnerMixin.run_command_interactive()(inherited stdio) andDockerComposeMixin.resolve_compose_cli()(one-shot plugin/legacy probe since interactive runs can't inspect captured output). Compose-file resolution extracted toresolve_active_compose_files()and reused;runhonors-f/-d. Documented in the main--helpepilog andcomposer run --help.
v1.1.3
- Update-Then-Recreate (
-u/--update [service]):-unow pulls the latest image(s) and recreates immediately in one step. With a service name it scopes both the pull and the recreate —composer/cli.pykeepsnargs="?"/const=True,DockerComposeLaunchernow setsup_servicealongsidepull_service, andDockerComposeMixin.launch_containers()appends the service toup -dso only that service is recreated (Compose still starts its dependencies; recreate is image/config-change driven, no--force-recreate). Native Compose semantics: dependents aren't auto-restarted unless their own image changed. - Update-Only (
-uo/--update-only [service]): New flag preserving the previous-ubehavior — pull (optionally one service) before the normal fullup -dstartup, without scoping the recreate. Maps toupdate_images/pull_servicewithout settingup_service. - Restart (
-r/--restart [service]): New flag that runsdocker compose restart [service]instead of--down+ start, preserving containers so baked-in env vars survive. AddedDockerComposeMixin.restart_containers()and a dedicated launcher branch that resolves secrets, restarts, then monitors health (no post-start/migration hooks).RenderingMixin.render()is restart-aware: shows "Restart Services (svc)", hides the Pull/Post-Start rows, and labels a scoped-urecreate as "Start Compose (svc)".
v1.1.2
- Skip Commented-Out Var Refs:
required_compose_vars()now strips YAML comments before scanning, so a${VAR}inside a full-line or trailing# …comment is no longer counted as required. A mid-token#(e.g.url#frag) is preserved, so a real${VAR}after it still counts. AddsConfigMixin._COMMENT_RE.
v1.1.1
- Smarter Required-Var Detection:
required_compose_vars()no longer produces false "missing variable" failures. It strips$$escapes before scanning (so shell variables in command/healthcheck scripts like$$attemptsare not mistaken for compose interpolations), and subtracts variables the compose already supplies itself —ConfigMixin._compose_env_keys()collects keys anenvironment:block assigns a concrete literal value to (mapping and list syntax), while bare pass-throughs (- KEY) and interpolated values (KEY: ${KEY}) are still treated as needing a value.
v1.1.0
- Plaintext-First Secrets Resolution (default): Running with no secrets flags now auto-resolves secrets.
SecretsMixin.resolve_secrets()searches plaintext env candidates (.env,secrets/.env,.secrets/.env) and uses the first file that satisfies every variable required by the compose (computed via the newConfigMixin.required_compose_vars(), which parses${VAR}interpolations and skips those with a:-/-/:+/+default). If none qualify, it falls back to an encrypted file (secrets.enc,secrets/secrets.enc,.secrets/secrets.enc), prompting for the AGE private key only when one was not supplied via-k/positional/SOPS_AGE_KEY. Added env helpersparse_env_file(),parse_dotenv_text(),apply_env_values()and source helpersplaintext_env_candidates()/encrypted_secrets_path();DockerComposeLaunchernow trackssecrets_source. - Removed
-sd/--skip-decrypt: The skip-decrypt flag is obsolete and fully removed fromcomposer/cli.py,launcher.py,rendering.py, andsecrets_manager.py(droppedload_secrets()/load_secrets_from_file()and the dev-mode coupling that forced it).-d/--devis now purely the two-compose-file override mode and no longer dictates the secrets source. - Dev Mode Forces Debug:
-d/--devnow always turns debug on regardless of the project'sDEBUG/DEBUG_STATUSvalue (or its absence).DockerComposeMixin.sync_runtime_compose_override()injectsDEBUG: "True"andDEBUG_STATUS: "True"into every service'senvironmentin the last-applied override file (overriding any compose declaration),build_compose_env()exportsDEBUG=True/DEBUG_STATUS=Truefor${DEBUG}/${DEBUG_STATUS}interpolation, and the launcher forces thedebug_modeUI flag. Both names are added to the injected set so they never count as missing required secrets. - UI Refresh: Reworked the status panel in
RenderingMixin.render()— lighter━rules replacing the solid block bars, a bold title, the compose-file list on its own📂line, and a secrets-source flag (🔐 DECRYPTED <path>/🔓 PLAINTEXT <path>) replacing the old⚠️ BYPASS DECRYPTIONindicator. The first step is relabeledLoad Secretsand shows the resolved source path.
v1.0.1
- Runtime-Gated Image Publishing: Added
scripts/smoke-test.sh, which runs the built image and asserts--versionmatches theVERSIONfile,--helpexposes the core flags (--down/--purge/--volumes/--update/--build/--encrypt/--decrypt), the bundledage/sops/docker/docker composebinaries are runnable, thekeygenentrypoint route emits an AGE key, and an end-to-end age+sops encrypt/decrypt round trip succeeds..github/workflows/release.ymlnow builds the amd64 image withload: trueand runs the smoke tests before the multi-arch Docker Hub push, so a runtime-broken image can no longer be published..github/workflows/ci.ymlruns the same smoke tests on every push/PR tomain.
v1.0.0
- Composer Rebrand: Relaunched under the
Composername, replaced the oldDecrypterbranding, removed obsolete passphrase-based encryption/decryption support, and improved the modular package structure (composer/mixins) and single-status-line terminal UI. - Purge Flag (
-p/--purge): Added a--downchild flag incomposer/cli.pydriving a full compose teardown inDockerComposeMixin.down_containers()— appends-v(implies volume removal even without-v),--rmi localto drop built untagged images, and--remove-orphans. AddsDockerComposeMixin.prune_build_cache()runningdocker builder prune -ffor dangling BuildKit cache (not compose-scopeable). Wired throughdown_volumes/purgeonDockerComposeLauncher. - Tag-Driven Release Pipeline: Added
.github/workflows/release.ymltriggered byv*tags — verifies the tag matches theVERSIONfile, builds the multi-arch (linux/amd64,linux/arm64) image with Buildx, pushesdebeski/composer:<version>anddebeski/composer:latestto Docker Hub, and publishes a GitHub Release using the matchingCHANGELOG.mdsection. Added.github/workflows/ci.ymlrunningcompileall+ CLI smoke and a no-push Docker build on pushes/PRs tomain. - Changelog Renormalized: Folded the pre-release
v1.0.0–v2.0.0history into thev0.1.xseries so the first GitHub-Actions-published image starts a cleanv1.0.0.