Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions planning/releases/0.3.1.md
Original file line number Diff line number Diff line change
@@ -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=<ref>,target=<path>[,subpath=<abs>]`, 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.