From caff2545026e189b2d5e82e471c66ae8faacc3c2 Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Fri, 17 Jul 2026 15:55:42 +0300 Subject: [PATCH] docs: curate 0.3.1 release notes --- planning/releases/0.3.1.md | 50 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 planning/releases/0.3.1.md diff --git a/planning/releases/0.3.1.md b/planning/releases/0.3.1.md new file mode 100644 index 0000000..0769567 --- /dev/null +++ b/planning/releases/0.3.1.md @@ -0,0 +1,50 @@ +# compose2pod 0.3.1 — the `image` mount type + +A focused follow-up to 0.3.0: the long-form `volumes` `type: image` mount, which +closes the last long-form volume form Podman can express but compose2pod did not +yet parse. + +## Feature + +- **`type: image` volume mounts.** A long-form entry `{type: image, source, + target, read_only, image: {subpath}}` compiles to `podman run --mount + type=image,source=,target=[,subpath=]`, mounting an image's + rootfs into the container. Measured against `docker compose config` v5.1.2 and + Podman 6.0.1: + - `source` (the image reference) is **required** — Podman refuses a sourceless + image mount, so compose2pod does too (a rule-two narrowing; Docker allows it + optional at config). + - `read_only` is accepted but **inert** — an image mount is always read-only, + and Podman rejects both a `readonly` and an `rw` option on it, so no `ro` is + emitted (matching what Docker does with the field). + - `image: {subpath}` must be an **absolute** path — Podman requires it for an + image mount (a relative `subpath` is rejected at run time), unlike a `volume` + `subpath`, which may be relative. A `${VAR}` is carved out. + +## Docs + +- The README's supported-subset section, stale since before the 0.3.0 parity + work, now leads with the measured parity property (compose2pod refuses every + document `docker compose config` refuses, verified by the differential + conformance harness) and reflects the full 0.3.0 subset. + +## Downstream + +- `type: image` compose files that previously raised now compile. Nothing else + changes — the short form, the other long-form types, and every existing key + behave identically. +- With `image` landed, the honest subset is complete for its scope: every + remaining refusal of a form Docker accepts is either a permanent rule-two limit + (Podman cannot form the flag) or a genuinely niche gap (a Windows drive-letter + volume source on a Linux-targeting tool), each measured and documented in + `architecture/supported-subset.md`, `planning/deferred.md`, and + `planning/decisions/`. + +## Internals + +- Tests at 100% line coverage (enforced); `ruff select=ALL`, `ty`, `eof-fixer` + clean; the conformance harness (real Docker CLI) and integration harness (real + Podman) both green — the integration suite mounts an image's rootfs on real + Podman, and the final review re-measured every emitted `--mount` option against + Podman 6.0.1, catching (and closing) a relative-`subpath` value Podman rejects + at run time.