diff --git a/build_and_push.sh b/build_and_push.sh index 1f7195e..606f633 100755 --- a/build_and_push.sh +++ b/build_and_push.sh @@ -1,16 +1,18 @@ #!/bin/bash -# Format: "service|image|manual" +# Format: "service|image|flag|context|dockerfile|platforms" +# Leave dockerfile empty if using the default Dockerfile in the context directory. +# Leave platforms empty to use the default (linux/amd64,linux/arm/v7,linux/arm64). # Entries with "manual" as third field are excluded from "All" and must be selected individually. SERVICES=( - "wireguard-webadmin|eduardosilva/wireguard_webadmin|" - "wireguard-webadmin-cron|eduardosilva/wireguard_webadmin_cron|" - "wireguard-webadmin-dns|eduardosilva/wireguard_webadmin_dns|" - "wireguard-webadmin-nginx|eduardosilva/wireguard_webadmin_nginx|" - "wireguard-webadmin-rrdtool|eduardosilva/wireguard_webadmin_rrdtool|" - "wireguard-webadmin-caddy|eduardosilva/wireguard_webadmin_caddy|" - "wireguard-webadmin-auth-gateway|eduardosilva/wireguard_webadmin_auth_gateway|" - "wireguard-webadmin-cluster-node|eduardosilva/wireguard-webadmin-cluster-node|manual" + "wireguard-webadmin|eduardosilva/wireguard_webadmin||.|" + "wireguard-webadmin-cron|eduardosilva/wireguard_webadmin_cron||./containers/cron|Dockerfile-cron" + "wireguard-webadmin-dns|eduardosilva/wireguard_webadmin_dns||./containers/dnsmasq|Dockerfile-dnsmasq" + "wireguard-webadmin-nginx|eduardosilva/wireguard_webadmin_nginx||.|Dockerfile_nginx" + "wireguard-webadmin-rrdtool|eduardosilva/wireguard_webadmin_rrdtool||./containers/rrdtool|Dockerfile-rrdtool" + "wireguard-webadmin-caddy|eduardosilva/wireguard_webadmin_caddy||./containers/caddy|Dockerfile-caddy" + "wireguard-webadmin-auth-gateway|eduardosilva/wireguard_webadmin_auth_gateway||./containers/auth-gateway|Dockerfile-auth-gateway|" + "wireguard-webadmin-cluster-node|eduardosilva/wireguard-webadmin-cluster-node|manual|./containers/cluster_node|Dockerfile-cluster_node" ) SEP="==================================================================" @@ -37,7 +39,7 @@ echo " Image to build and push:" echo " 0) All images (default, excludes manual-only)" i=1 for entry in "${SERVICES[@]}"; do - IFS="|" read -r SVC IMG FLAG <<< "$entry" + IFS="|" read -r SVC IMG FLAG CTX DOC <<< "$entry" if [ "$FLAG" = "manual" ]; then printf " %d) %s [manual only]\n" "$i" "$SVC" else @@ -52,10 +54,9 @@ read img_choice if [ -z "$img_choice" ] || [ "$img_choice" = "0" ]; then SELECTED=() for entry in "${SERVICES[@]}"; do - IFS="|" read -r SVC IMG FLAG <<< "$entry" + IFS="|" read -r SVC IMG FLAG CTX DOC <<< "$entry" [ "$FLAG" != "manual" ] && SELECTED+=("$entry") done - BUILD_SVC="" else if ! echo "$img_choice" | grep -qE '^[0-9]+$'; then echo "Invalid choice." && exit 1 @@ -65,17 +66,21 @@ else echo "Invalid choice." && exit 1 fi SELECTED=("${SERVICES[$idx]}") - BUILD_SVC="${SERVICES[$idx]%%|*}" fi # ── Confirm ── echo "" echo "$SEP" -echo " Tag : $TAG" +echo " Tag : $TAG" +echo " Default : linux/amd64,linux/arm64" echo " Images:" for entry in "${SELECTED[@]}"; do - IFS="|" read -r SVC IMG FLAG <<< "$entry" - printf " - %s:%s\n" "$IMG" "$TAG" + IFS="|" read -r SVC IMG FLAG CTX DOC PLATFORMS <<< "$entry" + if [ -n "$PLATFORMS" ]; then + printf " - %s:%s [%s]\n" "$IMG" "$TAG" "$PLATFORMS" + else + printf " - %s:%s\n" "$IMG" "$TAG" + fi done echo "$SEP" printf "Confirm? [y/N]: " @@ -85,36 +90,64 @@ case "$confirm" in *) echo "Aborted." && exit 0 ;; esac -# ── Prune ── +# ── Setup QEMU + Buildx ── echo "" +echo "$SEP" +echo "Removing existing buildx builder (if any)..." +docker buildx rm multi-builder 2>/dev/null || true + echo "$SEP" echo "Pruning Docker system..." docker system prune -a -# ── Build ── -echo "" echo "$SEP" -echo "Building..." -cat .gitignore > .dockerignore -TAG=$TAG docker compose -f docker-compose-build.yml build $BUILD_SVC -if [ $? -ne 0 ]; then - echo "Build failed." && exit 1 +if [ "$(uname)" = "Linux" ]; then + echo "Setting up QEMU for ARM emulation..." + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + echo "$SEP" + echo "Creating buildx builder..." + docker buildx create --name multi-builder --use +else + CURRENT_CONTEXT=$(docker context show) + echo "macOS detected — using existing builder: $CURRENT_CONTEXT" + docker buildx use "$CURRENT_CONTEXT" fi -# ── Push ── +# ── .dockerignore ── +cat .gitignore > .dockerignore + +# ── Build and push ── +DEFAULT_PLATFORMS="linux/amd64,linux/arm64" echo "" echo "$SEP" -echo "Pushing..." +echo "Building and pushing..." for entry in "${SELECTED[@]}"; do - IFS="|" read -r SVC IMAGE FLAG <<< "$entry" - IMAGE="$IMAGE:$TAG" + IFS="|" read -r SVC IMG FLAG CTX DOC PLATFORMS <<< "$entry" + FULL_IMAGE="$IMG:$TAG" + BUILD_PLATFORMS="${PLATFORMS:-$DEFAULT_PLATFORMS}" + echo "" - echo "--- Pushing $IMAGE..." - docker push "$IMAGE" - if [ $? -ne 0 ]; then - echo "ERROR pushing $IMAGE" && exit 1 + echo "--- Building $FULL_IMAGE ($BUILD_PLATFORMS)..." + + if [ -z "$DOC" ]; then + docker buildx build \ + --platform "$BUILD_PLATFORMS" \ + -t "$FULL_IMAGE" \ + --push \ + "$CTX" + else + docker buildx build \ + --platform "$BUILD_PLATFORMS" \ + -t "$FULL_IMAGE" \ + --push \ + -f "$CTX/$DOC" \ + "$CTX" fi - echo "--- $IMAGE pushed successfully." + + if [ $? -ne 0 ]; then + echo "ERROR building/pushing $FULL_IMAGE" && exit 1 + fi + echo "--- $FULL_IMAGE built and pushed successfully." done echo ""