Replace vendored docker-compose with podman-compose
podman-compose and docker-compose aren't discovered the same way by `podman compose` - verified live (a fake-binary test reading podman's own provider-search error output) that docker-compose is searched for by exact path across a fixed list of CLI-plugin directories, while podman-compose is instead looked up as a plain command on $PATH. This package installs to /usr/local/bin/podman-compose accordingly, not under any cli-plugins/ directory. Unlike docker-compose (a single static Go binary), podman-compose is a Python script with two runtime dependencies neither of which ship with Unraid's own Python3 - PyYAML and python-dotenv, vendored here as plain pure-Python source (no C extension build; PyYAML's own fallback handles its optional C accelerator being absent). Verified end-to-end on a real host: with the previous docker-compose binary temporarily moved aside to confirm podman-compose was actually the one invoked, `podman compose up/ps/down` ran a real compose project correctly, including a live HTTP check against the started service. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
# packages/podman-compose/
|
||||
|
||||
Pinned versions: see `PODMAN_COMPOSE_VERSION`/`PYYAML_VERSION`/
|
||||
`PYTHON_DOTENV_VERSION` in [versions.env](../../versions.env).
|
||||
|
||||
`podman compose` (backing `webui/plugins/podman/ajax/compose.php`, the
|
||||
WebUI's Compose panel) has no compose implementation of its own — it
|
||||
needs an external "compose provider" command. This project previously
|
||||
vendored `docker/compose` (the Go CLI-plugin binary) for that role;
|
||||
this package replaces it with `podman-compose` instead.
|
||||
|
||||
The two aren't discovered the same way — verified live against a real
|
||||
podman install (placing a fake executable and reading podman's own
|
||||
provider-search error output): `docker-compose` is searched for by exact
|
||||
path across a fixed list of CLI-plugin directories, while `podman-compose`
|
||||
is looked up as a plain command on `$PATH`. That's why this package
|
||||
installs to `/usr/local/bin/podman-compose` rather than under any
|
||||
`cli-plugins/` directory.
|
||||
|
||||
Unlike `docker-compose`, `podman-compose` is a single Python script, not a
|
||||
compiled binary. Unraid ships Python3 itself but neither of its two
|
||||
runtime dependencies, so this package also vendors:
|
||||
|
||||
- `PyYAML` — only the pure-Python `yaml/` package, not the `_yaml` C
|
||||
extension (which would need libyaml plus a compiler). `yaml/__init__.py`
|
||||
falls back gracefully when the C accelerator isn't importable, so the
|
||||
pure-Python source is sufficient for what podman-compose needs from it.
|
||||
- `python-dotenv` — pure Python throughout, no C extensions at all.
|
||||
|
||||
Verified end-to-end on a real Unraid host: the vendored bundle correctly
|
||||
runs `podman compose up`/`ps`/`down` against a real compose project
|
||||
(with the pre-existing `docker-compose` binary temporarily moved aside
|
||||
to confirm `podman-compose` was the one actually being invoked, not a
|
||||
leftover), including a live HTTP check against the started service.
|
||||
@@ -0,0 +1,83 @@
|
||||
#!/bin/bash
|
||||
# =============================================================================
|
||||
# packages/podman-compose/podman-compose.SlackBuild
|
||||
#
|
||||
# Packages podman-compose (github.com/containers/podman-compose) — the
|
||||
# external "compose provider" `podman compose` shells out to (see
|
||||
# versions.env's PODMAN_COMPOSE_* block for the full story, including why
|
||||
# this replaces the project's earlier vendored docker-compose). Verified
|
||||
# live against a real podman install that podman-compose is looked up as a
|
||||
# plain $PATH command, unlike docker-compose's fixed CLI-plugin-directory
|
||||
# search — so this installs a wrapper at /usr/local/bin/podman-compose.
|
||||
#
|
||||
# podman-compose itself is a single Python script (not a compiled binary),
|
||||
# with two runtime dependencies — PyYAML and python-dotenv — vendored here
|
||||
# as plain pure-Python source (no C extension build) since Unraid ships
|
||||
# Python3 but neither of those modules.
|
||||
# =============================================================================
|
||||
|
||||
set -eu
|
||||
|
||||
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
# shellcheck source=/dev/null
|
||||
. "$REPO_ROOT/scripts/lib/slackbuild-common.sh"
|
||||
# shellcheck source=/dev/null
|
||||
. "$REPO_ROOT/versions.env"
|
||||
|
||||
VERSION="$PODMAN_COMPOSE_VERSION"
|
||||
ARCH="$PKG_ARCH"
|
||||
BUILD="$PKG_BUILD"
|
||||
TAG="$PKG_TAG"
|
||||
|
||||
sb_init "podman-compose"
|
||||
|
||||
script=$(sb_fetch_and_verify "$PODMAN_COMPOSE_SRC_URL" "$PODMAN_COMPOSE_SRC_SHA256" "podman_compose-$VERSION.py")
|
||||
pyyaml_tarball=$(sb_fetch_and_verify "$PYYAML_SRC_URL" "$PYYAML_SRC_SHA256" "pyyaml-$PYYAML_VERSION.tar.gz")
|
||||
dotenv_tarball=$(sb_fetch_and_verify "$PYTHON_DOTENV_SRC_URL" "$PYTHON_DOTENV_SRC_SHA256" "python-dotenv-$PYTHON_DOTENV_VERSION.tar.gz")
|
||||
|
||||
libdir="$PKG/usr/local/lib/podman-compose"
|
||||
mkdir -p "$libdir"
|
||||
install -m 0644 "$script" "$libdir/podman_compose.py"
|
||||
|
||||
# Only the pure-Python "yaml" package, not the "_yaml" C extension (which
|
||||
# would need libyaml plus a compiler toolchain this build doesn't otherwise
|
||||
# require) — see the header comment on why the pure-Python fallback is
|
||||
# sufficient for what podman-compose actually needs from it.
|
||||
tar -xzf "$pyyaml_tarball" -C "$TMP" "pyyaml-$PYYAML_VERSION/lib/yaml"
|
||||
cp -r "$TMP/pyyaml-$PYYAML_VERSION/lib/yaml" "$libdir/yaml"
|
||||
|
||||
tar -xzf "$dotenv_tarball" -C "$TMP" "python_dotenv-$PYTHON_DOTENV_VERSION/src/dotenv"
|
||||
cp -r "$TMP/python_dotenv-$PYTHON_DOTENV_VERSION/src/dotenv" "$libdir/dotenv"
|
||||
|
||||
# A thin wrapper, not a symlink or bare shebang: podman_compose.py's own
|
||||
# shebang (whatever upstream wrote, a plain "#!/usr/bin/env python3") has
|
||||
# no idea the vendored yaml/dotenv sit right next to it, so PYTHONPATH has
|
||||
# to be set by whatever actually invokes the script.
|
||||
install -d "$PKG/usr/local/bin"
|
||||
cat > "$PKG/usr/local/bin/podman-compose" <<'WRAPPER'
|
||||
#!/bin/sh
|
||||
exec env PYTHONPATH="/usr/local/lib/podman-compose${PYTHONPATH:+:$PYTHONPATH}" \
|
||||
/usr/bin/python3 /usr/local/lib/podman-compose/podman_compose.py "$@"
|
||||
WRAPPER
|
||||
chmod 0755 "$PKG/usr/local/bin/podman-compose"
|
||||
|
||||
docdir="$PKG/usr/doc/podman-compose-$VERSION"
|
||||
mkdir -p "$docdir"
|
||||
{
|
||||
echo "podman-compose $VERSION"
|
||||
echo "https://github.com/containers/podman-compose"
|
||||
echo
|
||||
echo "Vendored alongside its two runtime dependencies (bundled as plain"
|
||||
echo "pure-Python source, no C extensions built):"
|
||||
echo " PyYAML $PYYAML_VERSION - https://pypi.org/project/PyYAML/"
|
||||
echo " python-dotenv $PYTHON_DOTENV_VERSION - https://pypi.org/project/python-dotenv/"
|
||||
echo
|
||||
echo "See versions.env for pinned source URLs and SHA256 checksums."
|
||||
} > "$docdir/README"
|
||||
{
|
||||
echo "Built by unraid-podman from upstream source."
|
||||
echo "Package: podman-compose $VERSION"
|
||||
echo "Built: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
||||
} > "$docdir/unraid-podman.build-info"
|
||||
|
||||
sb_make_package "$VERSION" "$ARCH" "$BUILD" "$TAG"
|
||||
@@ -0,0 +1,19 @@
|
||||
# HOW TO EDIT THIS FILE:
|
||||
# The "handy ruler" below makes it easier to edit a package description.
|
||||
# Line up the first '|' above the ':' following the base package name, and
|
||||
# the '|' on the right side marks the last column you can put a character in.
|
||||
# You must make exactly 11 lines for the formatting to be correct. It's also
|
||||
# customary to leave one space after the ':' except on otherwise blank lines.
|
||||
|
||||
|-----handy-ruler------------------------------------------------|
|
||||
podman-compose: podman-compose (external Compose provider for podman compose)
|
||||
podman-compose:
|
||||
podman-compose: A Python script that implements Docker Compose file support
|
||||
podman-compose: on top of podman, installed to /usr/local/bin so
|
||||
podman-compose: `podman compose` finds it as its external provider.
|
||||
podman-compose: Required by the WebUI's Compose panel. Bundled with its
|
||||
podman-compose: two runtime dependencies (PyYAML, python-dotenv) as plain
|
||||
podman-compose: pure-Python source.
|
||||
podman-compose:
|
||||
podman-compose: Homepage: https://github.com/containers/podman-compose
|
||||
podman-compose:
|
||||
Reference in New Issue
Block a user