build: route docker-build through buildx for multi-arch + push
Setting REGISTRY now switches `make docker-build` from a single-arch local build to a multi-arch (linux/amd64+linux/arm64) buildx build that pushes $REGISTRY/$IMAGE:$VERSION and :latest. The redundant docker-buildx target is removed. Bump the builder base image to golang:1.25-alpine so protoc-gen-go-grpc@latest installs cleanly. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
# Build stage
|
# Build stage
|
||||||
FROM golang:1.24-alpine AS builder
|
FROM golang:1.25-alpine AS builder
|
||||||
|
|
||||||
# Build arguments
|
# Build arguments
|
||||||
ARG VERSION=dev
|
ARG VERSION=dev
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
.PHONY: proto proto-gen proto-clean deps build build-dev run run-grpc run-rest test lint fmt vet check docker-build docker-build-dev docker-buildx-setup docker-buildx docker-run clean help
|
.PHONY: proto proto-gen proto-clean deps build build-dev run run-grpc run-rest test lint fmt vet check docker-build docker-build-dev docker-buildx-setup docker-run clean help
|
||||||
|
|
||||||
# Variables
|
# Variables
|
||||||
REGISTRY ?=
|
REGISTRY ?=
|
||||||
IMAGE ?=
|
IMAGE ?= notifier
|
||||||
PLATFORMS ?= linux/amd64,linux/arm64
|
PLATFORMS ?= linux/amd64,linux/arm64
|
||||||
PROTO_DIR=api/grpc
|
PROTO_DIR=api/grpc
|
||||||
PROTO_FILE=$(PROTO_DIR)/notifier.proto
|
PROTO_FILE=$(PROTO_DIR)/notifier.proto
|
||||||
@@ -142,18 +142,37 @@ qa: fmt vet lint test
|
|||||||
@echo "All quality checks passed!"
|
@echo "All quality checks passed!"
|
||||||
|
|
||||||
# Build Docker image (production - optimized)
|
# Build Docker image (production - optimized)
|
||||||
|
# When REGISTRY is set, builds a multi-arch image and pushes
|
||||||
|
# $(REGISTRY)/$(IMAGE):$(VERSION) and :latest.
|
||||||
|
# Otherwise builds a single-arch local image tagged $(IMAGE):latest.
|
||||||
docker-build:
|
docker-build:
|
||||||
@echo "Building Docker image (production - optimized)..."
|
|
||||||
@echo "Version: $(VERSION)"
|
@echo "Version: $(VERSION)"
|
||||||
@echo "Git Commit: $(GIT_COMMIT)"
|
@echo "Git Commit: $(GIT_COMMIT)"
|
||||||
@echo "Build Time: $(BUILD_TIME)"
|
@echo "Build Time: $(BUILD_TIME)"
|
||||||
|
ifeq ($(strip $(REGISTRY)),)
|
||||||
|
@echo "Building single-arch local Docker image..."
|
||||||
docker build \
|
docker build \
|
||||||
--build-arg VERSION=$(VERSION) \
|
--build-arg VERSION=$(VERSION) \
|
||||||
--build-arg GIT_COMMIT=$(GIT_COMMIT) \
|
--build-arg GIT_COMMIT=$(GIT_COMMIT) \
|
||||||
--build-arg BUILD_TIME=$(BUILD_TIME) \
|
--build-arg BUILD_TIME=$(BUILD_TIME) \
|
||||||
--build-arg BUILD_FLAGS="-s -w" \
|
--build-arg BUILD_FLAGS="-s -w" \
|
||||||
-t notifier:latest .
|
-t $(IMAGE):latest .
|
||||||
@echo "Docker image built successfully (production - optimized)"
|
@echo "Docker image built successfully (production - optimized)"
|
||||||
|
else
|
||||||
|
@$(MAKE) docker-buildx-setup
|
||||||
|
@echo "Building multi-arch image ($(PLATFORMS)) and pushing to $(REGISTRY)/$(IMAGE):$(VERSION)..."
|
||||||
|
docker buildx build \
|
||||||
|
--platform $(PLATFORMS) \
|
||||||
|
--build-arg VERSION=$(VERSION) \
|
||||||
|
--build-arg GIT_COMMIT=$(GIT_COMMIT) \
|
||||||
|
--build-arg BUILD_TIME=$(BUILD_TIME) \
|
||||||
|
--build-arg BUILD_FLAGS="-s -w" \
|
||||||
|
--provenance=false \
|
||||||
|
--tag $(REGISTRY)/$(IMAGE):$(VERSION) \
|
||||||
|
--tag $(REGISTRY)/$(IMAGE):latest \
|
||||||
|
--push .
|
||||||
|
@echo "Multi-arch image pushed successfully"
|
||||||
|
endif
|
||||||
|
|
||||||
# Build Docker image with debug symbols (development)
|
# Build Docker image with debug symbols (development)
|
||||||
docker-build-dev:
|
docker-build-dev:
|
||||||
@@ -172,30 +191,11 @@ docker-build-dev:
|
|||||||
# Set up Docker buildx builder for multi-arch builds
|
# Set up Docker buildx builder for multi-arch builds
|
||||||
docker-buildx-setup:
|
docker-buildx-setup:
|
||||||
@echo "Setting up Docker buildx builder..."
|
@echo "Setting up Docker buildx builder..."
|
||||||
@docker buildx inspect multiarch > /dev/null 2>&1 || docker buildx create --name multiarch --use
|
@docker buildx inspect multiarch > /dev/null 2>&1 || docker buildx create --name multiarch --driver docker-container
|
||||||
|
@docker buildx use multiarch
|
||||||
@docker buildx inspect multiarch --bootstrap
|
@docker buildx inspect multiarch --bootstrap
|
||||||
@echo "Buildx builder ready"
|
@echo "Buildx builder ready"
|
||||||
|
|
||||||
# Build and push multi-arch Docker image
|
|
||||||
docker-buildx:
|
|
||||||
ifndef IMAGE
|
|
||||||
$(error IMAGE is required. Usage: make docker-buildx IMAGE=registry.example.com/org/notifier VERSION=v0.1.0)
|
|
||||||
endif
|
|
||||||
@echo "Building and pushing multi-arch Docker image..."
|
|
||||||
@echo "Version: $(VERSION)"
|
|
||||||
@echo "Platforms: $(PLATFORMS)"
|
|
||||||
@echo "Image: $(IMAGE):$(VERSION)"
|
|
||||||
docker buildx build \
|
|
||||||
--platform $(PLATFORMS) \
|
|
||||||
--build-arg VERSION=$(VERSION) \
|
|
||||||
--build-arg GIT_COMMIT=$(GIT_COMMIT) \
|
|
||||||
--build-arg BUILD_TIME=$(BUILD_TIME) \
|
|
||||||
--build-arg BUILD_FLAGS="-s -w" \
|
|
||||||
--tag $(IMAGE):$(VERSION) \
|
|
||||||
--tag $(IMAGE):latest \
|
|
||||||
--push .
|
|
||||||
@echo "Multi-arch image pushed successfully"
|
|
||||||
|
|
||||||
# Run Docker container
|
# Run Docker container
|
||||||
docker-run:
|
docker-run:
|
||||||
@echo "Running Docker container..."
|
@echo "Running Docker container..."
|
||||||
@@ -242,13 +242,15 @@ help:
|
|||||||
@echo " deps - Install Go dependencies"
|
@echo " deps - Install Go dependencies"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Docker:"
|
@echo "Docker:"
|
||||||
@echo " docker-build - Build Docker image (single arch)"
|
@echo " docker-build - Build Docker image"
|
||||||
|
@echo " - default: single-arch local image"
|
||||||
|
@echo " - with REGISTRY set: multi-arch (amd64+arm64) build + push"
|
||||||
@echo " docker-build-dev - Build Docker image with debug symbols"
|
@echo " docker-build-dev - Build Docker image with debug symbols"
|
||||||
@echo " docker-buildx-setup - Set up buildx builder for multi-arch"
|
@echo " docker-buildx-setup - Set up buildx builder for multi-arch"
|
||||||
@echo " docker-buildx - Build and push multi-arch image (amd64+arm64)"
|
|
||||||
@echo " docker-run - Run Docker container locally"
|
@echo " docker-run - Run Docker container locally"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Variables:"
|
@echo "Variables:"
|
||||||
@echo " VERSION - Image version tag (default: dev)"
|
@echo " VERSION - Image version tag (default: dev)"
|
||||||
@echo " IMAGE - Full image name (required for buildx, e.g. registry.example.com/org/notifier)"
|
@echo " REGISTRY - Registry prefix for docker-build (e.g. registry.example.com/org)"
|
||||||
|
@echo " IMAGE - Image name (default: notifier)"
|
||||||
@echo " PLATFORMS - Build platforms (default: $(PLATFORMS))"
|
@echo " PLATFORMS - Build platforms (default: $(PLATFORMS))"
|
||||||
|
|||||||
@@ -369,11 +369,23 @@ protoc --go_out=. --go-grpc_out=. api/grpc/notifier.proto
|
|||||||
|
|
||||||
### Docker
|
### Docker
|
||||||
|
|
||||||
**Build:**
|
**Build (single-arch, local):**
|
||||||
```bash
|
```bash
|
||||||
docker build -t notifier:latest .
|
make docker-build
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Build and push a multi-arch image (linux/amd64 + linux/arm64):**
|
||||||
|
```bash
|
||||||
|
# Pushes $REGISTRY/$IMAGE:$VERSION and :latest.
|
||||||
|
# Requires Docker buildx (bundled with Docker Desktop; on Linux also run
|
||||||
|
# `docker run --rm --privileged tonistiigi/binfmt --install all` once to
|
||||||
|
# register the QEMU emulators).
|
||||||
|
REGISTRY=registry.example.com/org VERSION=v0.1.3 make docker-build
|
||||||
|
```
|
||||||
|
|
||||||
|
Override `IMAGE` (default `notifier`) or `PLATFORMS` (default
|
||||||
|
`linux/amd64,linux/arm64`) as needed.
|
||||||
|
|
||||||
**Run:**
|
**Run:**
|
||||||
```bash
|
```bash
|
||||||
docker run -d \
|
docker run -d \
|
||||||
@@ -541,7 +553,7 @@ make lint # Run golangci-lint
|
|||||||
make check # Run fmt-check + vet + mod verify
|
make check # Run fmt-check + vet + mod verify
|
||||||
make qa # Run all quality checks
|
make qa # Run all quality checks
|
||||||
make proto-gen # Generate protobuf code
|
make proto-gen # Generate protobuf code
|
||||||
make docker-build # Build Docker image
|
make docker-build # Build Docker image (multi-arch + push when DOCKER_REGISTRY is set)
|
||||||
make clean # Clean build artifacts
|
make clean # Clean build artifacts
|
||||||
make help # Show all available targets
|
make help # Show all available targets
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user