Multi-arch Docker push: amd64 + arm64 with manifest
All checks were successful
CI / test (push) Successful in 1m8s
All checks were successful
CI / test (push) Successful in 1m8s
- Dockerfile.static: takes pre-built binary, no compilation - push-docker.sh: downloads x86_64 from CI release, builds arm64 natively, creates multi-arch manifest and pushes both - docker pull works on both Intel and Apple Silicon / RPi Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
18
Dockerfile.static
Normal file
18
Dockerfile.static
Normal file
@@ -0,0 +1,18 @@
|
||||
# Minimal image from a pre-built static binary
|
||||
# Usage: docker build -f Dockerfile.static --build-arg BINARY=dist/btest .
|
||||
FROM debian:bookworm-slim
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ca-certificates \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ARG BINARY=dist/btest
|
||||
COPY ${BINARY} /usr/local/bin/btest
|
||||
RUN chmod +x /usr/local/bin/btest
|
||||
|
||||
EXPOSE 2000/tcp
|
||||
EXPOSE 2001-2100/udp
|
||||
EXPOSE 2257-2356/udp
|
||||
|
||||
ENTRYPOINT ["btest"]
|
||||
CMD ["-s"]
|
||||
@@ -1,6 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build and push Docker image to Gitea registry.
|
||||
# Run on a machine with Docker (your Mac).
|
||||
# Build and push multi-arch Docker images to Gitea registry.
|
||||
#
|
||||
# Prerequisites:
|
||||
# - dist/btest-linux-x86_64.tar.gz (from CI release or scripts/build-linux.sh)
|
||||
# - Native macOS binary (built automatically)
|
||||
#
|
||||
# Usage:
|
||||
# ./scripts/push-docker.sh v0.1.0
|
||||
@@ -16,32 +19,90 @@ if [[ -f .env ]]; then
|
||||
fi
|
||||
|
||||
TAG="${1:?Usage: $0 <tag> (e.g. v0.1.0)}"
|
||||
REGISTRY="${GITEA_URL:-https://git.manko.yoga}"
|
||||
REGISTRY_HOST="${REGISTRY#https://}"
|
||||
REGISTRY_HOST="${GITEA_URL:-https://git.manko.yoga}"
|
||||
REGISTRY_HOST="${REGISTRY_HOST#https://}"
|
||||
REGISTRY_HOST="${REGISTRY_HOST#http://}"
|
||||
IMAGE="${REGISTRY_HOST}/manawenuz/btest-rs"
|
||||
|
||||
echo "=== Building Docker image for ${IMAGE}:${TAG} ==="
|
||||
|
||||
# Build the image
|
||||
docker build -t "${IMAGE}:${TAG}" -t "${IMAGE}:latest" .
|
||||
|
||||
echo ""
|
||||
echo "=== Pushing to ${REGISTRY_HOST} ==="
|
||||
|
||||
# Login if needed (uses GITEA_USER + GITEA_TOKEN from .env)
|
||||
# Login
|
||||
if [[ -n "${GITEA_TOKEN:-}" ]]; then
|
||||
DOCKER_USER="${GITEA_USER:?Set GITEA_USER in .env (your Gitea username)}"
|
||||
DOCKER_USER="${GITEA_USER:?Set GITEA_USER in .env}"
|
||||
echo "${GITEA_TOKEN}" | docker login "${REGISTRY_HOST}" -u "${DOCKER_USER}" --password-stdin
|
||||
fi
|
||||
|
||||
docker push "${IMAGE}:${TAG}"
|
||||
docker push "${IMAGE}:latest"
|
||||
mkdir -p dist/docker-amd64 dist/docker-arm64
|
||||
|
||||
# --- x86_64 binary ---
|
||||
if [[ ! -f dist/docker-amd64/btest ]]; then
|
||||
if [[ -f dist/btest-linux-x86_64.tar.gz ]]; then
|
||||
echo "Extracting x86_64 binary from tarball..."
|
||||
tar xzf dist/btest-linux-x86_64.tar.gz -C dist/docker-amd64/
|
||||
else
|
||||
echo "No x86_64 binary found. Downloading from release ${TAG}..."
|
||||
GITEA_URL_FULL="https://${REGISTRY_HOST}"
|
||||
RELEASE_URL=$(curl -sf \
|
||||
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||
"${GITEA_URL_FULL}/api/v1/repos/manawenuz/btest-rs/releases/tags/${TAG}" \
|
||||
| jq -r '.assets[] | select(.name=="btest-linux-x86_64.tar.gz") | .browser_download_url')
|
||||
if [[ -n "$RELEASE_URL" ]]; then
|
||||
curl -sL "$RELEASE_URL" | tar xz -C dist/docker-amd64/
|
||||
else
|
||||
echo "Error: Cannot find x86_64 binary. Run CI first or scripts/build-linux.sh"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# --- arm64 binary (native build on Apple Silicon) ---
|
||||
if [[ ! -f dist/docker-arm64/btest ]]; then
|
||||
echo "Building native arm64 binary..."
|
||||
cargo build --release
|
||||
cp target/release/btest dist/docker-arm64/btest
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Done! Images pushed:"
|
||||
echo " ${IMAGE}:${TAG}"
|
||||
echo " ${IMAGE}:latest"
|
||||
echo "=== Building amd64 image ==="
|
||||
docker build --platform linux/amd64 -f Dockerfile.static \
|
||||
--build-arg BINARY=dist/docker-amd64/btest \
|
||||
-t "${IMAGE}:${TAG}-amd64" .
|
||||
|
||||
echo ""
|
||||
echo "=== Building arm64 image ==="
|
||||
docker build --platform linux/arm64 -f Dockerfile.static \
|
||||
--build-arg BINARY=dist/docker-arm64/btest \
|
||||
-t "${IMAGE}:${TAG}-arm64" .
|
||||
|
||||
echo ""
|
||||
echo "=== Pushing ==="
|
||||
docker push "${IMAGE}:${TAG}-amd64"
|
||||
docker push "${IMAGE}:${TAG}-arm64"
|
||||
|
||||
# Create and push multi-arch manifest
|
||||
echo ""
|
||||
echo "=== Creating multi-arch manifest ==="
|
||||
docker manifest create "${IMAGE}:${TAG}" \
|
||||
"${IMAGE}:${TAG}-amd64" \
|
||||
"${IMAGE}:${TAG}-arm64" 2>/dev/null || \
|
||||
docker manifest create --amend "${IMAGE}:${TAG}" \
|
||||
"${IMAGE}:${TAG}-amd64" \
|
||||
"${IMAGE}:${TAG}-arm64"
|
||||
|
||||
docker manifest push "${IMAGE}:${TAG}"
|
||||
|
||||
# Tag as latest
|
||||
docker manifest create "${IMAGE}:latest" \
|
||||
"${IMAGE}:${TAG}-amd64" \
|
||||
"${IMAGE}:${TAG}-arm64" 2>/dev/null || \
|
||||
docker manifest create --amend "${IMAGE}:latest" \
|
||||
"${IMAGE}:${TAG}-amd64" \
|
||||
"${IMAGE}:${TAG}-arm64"
|
||||
|
||||
docker manifest push "${IMAGE}:latest"
|
||||
|
||||
echo ""
|
||||
echo "Done! Multi-arch images pushed:"
|
||||
echo " ${IMAGE}:${TAG} (amd64 + arm64)"
|
||||
echo " ${IMAGE}:latest (amd64 + arm64)"
|
||||
echo ""
|
||||
echo "Run with:"
|
||||
echo " docker run --rm -p 2000:2000 -p 2001-2100:2001-2100/udp ${IMAGE}:${TAG} -s -v"
|
||||
|
||||
Reference in New Issue
Block a user