You must login to view /lordwelch/podman-static/commit/57079cd64640a7e3d7457754d4e3918d6dd3a673.
The GitHub option should be usable for most people, it only links via username.

Files
podman-static/Makefile
2026-02-11 20:23:39 +01:00

208 lines
7.8 KiB
Makefile

SHELL := /usr/bin/env bash
PODMAN_IMAGE_NAME ?= mgoltzsche/podman
PODMAN_IMAGE ?= $(PODMAN_IMAGE_NAME):latest
PODMAN_IMAGE_TARGET ?= podmanall
PODMAN_MINIMAL_IMAGE ?= $(PODMAN_IMAGE)-minimal
PODMAN_REMOTE_IMAGE ?= $(PODMAN_IMAGE)-remote
PODMAN_TAR_IMAGE ?= $(PODMAN_IMAGE)-tar
PODMAN_SSH_IMAGE ?= mgoltzsche/podman-ssh
PODMAN_BUILD_OPTS ?= -t $(PODMAN_IMAGE)
PODMAN_MINIMAL_BUILD_OPTS ?= -t $(PODMAN_MINIMAL_IMAGE)
PODMAN_REMOTE_BUILD_OPTS ?= -t $(PODMAN_REMOTE_IMAGE)
GPG_IMAGE = gpg-signer
BUILD_DIR = ./build
BATS_VERSION = v1.11.0
BATS_DIR := $(BUILD_DIR)/bats-$(BATS_VERSION)
BATS = $(BATS_DIR)/bin/bats
BATS_TEST ?= test
# TODO: Make the tests work with podman in podman (GitHub's workflow runner also supports podman)
#DOCKER ?= $(if $(shell podman -v),podman,docker)
DOCKER ?= docker
export DOCKER
PLATFORM ?= linux/amd64
ARCH = $(shell echo "$(PLATFORM)" | sed -E 's!linux/([^/]+).*!\1!')
IMAGE_EXPORT_DIR = $(BUILD_DIR)/images/podman
BUILDX_BUILDER ?= podman-builder
# TODO: just push the other image and build tar files from output, skip tests for other platforms for now
BUILDX_OUTPUT ?= type=docker
BUILDX_OPTS ?= --builder=$(BUILDX_BUILDER) --output=$(BUILDX_OUTPUT) --platform=$(PLATFORM)
ASSET_NAME := podman-linux-$(ARCH)
ASSET_DIR := $(BUILD_DIR)/asset/$(ASSET_NAME)
images: podman podman-remote podman-minimal podman-tar-image
multiarch-tar multiarch-images: PLATFORM = linux/arm64/v8,linux/amd64
multiarch-tar: BUILDX_OUTPUT = type=local,dest=$(IMAGE_EXPORT_DIR)
multiarch-tar: TAR_TARGET ?= tar
multiarch-tar: podman-tar-image tar-all
multiarch-images: BUILDX_OUTPUT = type=image
multiarch-images: images
# Single arch builds don't have nested arch directory, thus set path as for multiarch
singlearch-tar: BUILDX_OUTPUT = type=local,dest=$(IMAGE_EXPORT_DIR)/linux_$(ARCH)
singlearch-tar: TAR_TARGET ?= tar
singlearch-tar: podman-tar-image
singlearch-tar:
make $(TAR_TARGET) PLATFORM="$(PLATFORM)" BUILDX_BUILDER="$(BUILDX_BUILDER)"
tar-all:
@{ \
set -e ;\
for PLATFORM in `echo "$(PLATFORM)" | sed 's/,/ /g'`; do \
printf '\nBuilding podman for %s...\n\n' "$$PLATFORM" ;\
make $(TAR_TARGET) PLATFORM="$$PLATFORM" BUILDX_BUILDER="$(BUILDX_BUILDER)" ;\
done ;\
}
podman: create-builder
$(DOCKER) buildx build $(BUILDX_OPTS) --force-rm $(PODMAN_BUILD_OPTS) --target $(PODMAN_IMAGE_TARGET) .
podman-tar-image:
$(DOCKER) buildx build $(BUILDX_OPTS) --force-rm -t $(PODMAN_TAR_IMAGE) --target tar-archive .
podman-minimal: create-builder
make podman PODMAN_IMAGE_TARGET=rootlesspodmanminimal BUILDX_OPTS="$(BUILDX_OPTS)" PODMAN_BUILD_OPTS="$(PODMAN_MINIMAL_BUILD_OPTS)"
podman-remote: create-builder
$(DOCKER) buildx build $(BUILDX_OPTS) --force-rm $(PODMAN_REMOTE_BUILD_OPTS) -f Dockerfile-remote .
podman-ssh: podman
$(DOCKER) buildx build $(BUILDX_OPTS) --force-rm -t $(PODMAN_SSH_IMAGE) -f Dockerfile-ssh --build-arg BASEIMAGE=$(PODMAN_IMAGE) .
create-builder:
$(DOCKER) buildx inspect $(BUILDX_BUILDER) >/dev/null 2<&1 || $(DOCKER) buildx create --name=$(BUILDX_BUILDER) >/dev/null
delete-builder:
$(DOCKER) buildx rm $(BUILDX_BUILDER)
register-qemu-binfmt: ## Enable multiarch support on the host
$(DOCKER) run --rm --privileged multiarch/qemu-user-static:7.0.0-7 --reset -p yes
test: test-use-cases test-minimal-image
test-use-cases: $(BATS)
DOCKER=$(DOCKER) \
PODMAN_IMAGE=$(PODMAN_IMAGE) \
PODMAN_REMOTE_IMAGE=$(PODMAN_REMOTE_IMAGE) \
PODMAN_TAR_IMAGE=$(PODMAN_TAR_IMAGE) \
$(BATS) -T $(BATS_TEST)
test-minimal-image: $(BATS)
DOCKER=$(DOCKER) \
PODMAN_IMAGE=$(PODMAN_MINIMAL_IMAGE) \
TEST_PREFIX=minimal \
TEST_SKIP_PORTMAPPING=true \
TEST_SKIP_PLAYKUBE=true \
$(BATS) -T test/rootless.bats
install:
cp -r $(ASSET_DIR)/usr $(ASSET_DIR)/etc /
tar: .podman-from-container
rm -f $(ASSET_DIR).tar.gz
install -Dm644 -t $(ASSET_DIR)/usr/local/lib/systemd/system \
conf/systemd/{podman-restart.service,podman.service,podman.socket}
install -Dm644 -t $(ASSET_DIR)/usr/local/lib/systemd/user \
conf/systemd/{podman-restart.service,podman.service,podman.socket}
tar -C $(ASSET_DIR)/.. -czvf $(ASSET_DIR).tar.gz $(ASSET_NAME)
.podman-from-container: IMAGE_ROOTFS = $(BUILD_DIR)/images/podman/linux_$(ARCH)
.podman-from-container: podman-tar-image
rm -rf $(ASSET_DIR)
mkdir -p $(ASSET_DIR)/etc $(ASSET_DIR)/usr/local/lib/systemd/{system,user}-generators $(ASSET_DIR)/usr/local/share
cp -rt $(ASSET_DIR)/etc $(IMAGE_ROOTFS)/etc/containers
cp -rt $(ASSET_DIR)/usr/local $(IMAGE_ROOTFS)/usr/local/{bin,lib,libexec}
cp -rt $(ASSET_DIR)/usr/local/share $(IMAGE_ROOTFS)/usr/local/share/{bash-completion,zsh,fish}
ln -s ../../../libexec/podman/quadlet $(ASSET_DIR)/usr/local/lib/systemd/user-generators/podman-user-generator
ln -s ../../../libexec/podman/quadlet $(ASSET_DIR)/usr/local/lib/systemd/system-generators/podman-system-generator
cp README.md $(ASSET_DIR)/
signed-tar: tar .gpg
@echo Running gpg signing container with GPG_SIGN_KEY and GPG_SIGN_KEY_PASSPHRASE
export GPG_SIGN_KEY
export GPG_SIGN_KEY_PASSPHRASE
@$(DOCKER) run --rm -v "`pwd`/build:/build" \
-e GPG_SIGN_KEY="$$GPG_SIGN_KEY" \
-e GPG_SIGN_KEY_PASSPHRASE="$$GPG_SIGN_KEY_PASSPHRASE" \
$(GPG_IMAGE) /bin/sh -c ' \
set -e; \
[ "$$GPG_SIGN_KEY" -a "$$GPG_SIGN_KEY_PASSPHRASE" ] || (echo Missing GPG_SIGN_KEY or GPG_SIGN_KEY_PASSPHRASE >&2; false); \
echo "$$GPG_SIGN_KEY" | gpg --batch --import -; \
rm -f $(ASSET_DIR).tar.gz.asc; \
echo "$$GPG_SIGN_KEY_PASSPHRASE" | (set -x; gpg --pinentry-mode loopback --command-fd 0 -a -o $(ASSET_DIR).tar.gz.asc --detach-sign $(ASSET_DIR).tar.gz)'
verify-signature:
( \
for _ in `seq 1 10`; do \
TMPDIR=$$(mktemp -d); \
export GNUPGHOME=$$TMPDIR; \
gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys 0CCF102C4F95D89E583FF1D4F8B5AF50344BB503 && \
gpg --list-keys && \
gpg --batch --verify $(ASSET_DIR).tar.gz.asc $(ASSET_DIR).tar.gz && \
rm -rf $$TMPDIR && \
exit 0 || \
sleep 1; \
rm -rf $$TMPDIR; \
done; \
exit 1; \
)
.gpg:
$(DOCKER) buildx build $(BUILDX_OPTS) --force-rm -t $(GPG_IMAGE) --target gpg .
run:
$(DOCKER) run -ti --rm --privileged \
-v "`pwd`/test/storage/user":/podman/.local/share/containers/storage \
$(PODMAN_IMAGE) /bin/sh
clean:
$(DOCKER) run --rm -v "`pwd`:/work" alpine:3.22 rm -rf /work/build
run-server: podman-ssh
# TODO: make sshd log to stdout (while still ensuring that we know when it is available)
$(DOCKER) run --rm --privileged --network=host \
-v "`pwd`/storage/user":/podman/.local/share/containers/storage \
-v "`pwd`/test:/build" \
-w /build \
"${PODMAN_SSH_IMAGE}" \
sh -c 'set -x; \
ssh-keygen -b 2048 -t rsa -N "" -f /podman/.ssh/ssh_host_rsa_key; \
ssh-keygen -b 521 -t ecdsa -N "" -f /podman/.ssh/ssh_host_ecdsa_key; \
[ -f /build/storage/user/client_rsa ] || ssh-keygen -b 2048 -t rsa -N "" -f /build/storage/user/client_rsa; \
cat /build/storage/user/client_rsa.pub > /podman/.ssh/authorized_keys; \
/usr/sbin/sshd -eD -f ~/.ssh/sshd_config & \
mkdir /tmp/podman; \
podman system service -t 0 unix:///tmp/podman/podman.sock'
# TODO: fix build run for external client
# see ssh connection: https://github.com/containers/podman/blob/v2.0.4/pkg/bindings/connection.go#L73
run-client: podman-remote
$(DOCKER) run --rm -it --network=host \
-v "`pwd`/test:/build" \
-w /build \
-e PODMAN_URL=ssh://podman@127.0.0.1:2222/tmp/podman/podman.sock?secure=True \
-e CONTAINER_SSHKEY=/build/storage/user/client_rsa \
"${PODMAN_REMOTE_IMAGE}" \
/bin/sh -c 'set -ex; \
podman --url=$$PODMAN_URL --log-level=info build /build/test'
#ssh -o "StrictHostKeyChecking no" -i /build/client_rsa podman@127.0.0.1 -p 2222 echo hello
$(BATS):
@echo Downloading bats
@{ \
set -e ;\
rm -rf $(BATS_DIR).tmp ;\
mkdir -p $(BATS_DIR).tmp ;\
git clone -c 'advice.detachedHead=false' --depth=1 --branch $(BATS_VERSION) https://github.com/bats-core/bats-core.git $(BATS_DIR).tmp >/dev/null ;\
$(BATS_DIR).tmp/install.sh "$(BATS_DIR)" ;\
rm -rf $(BATS_DIR).tmp ;\
}