Skip to content

Commit 0e03558

Browse files
kaovilaiclaude
andcommitted
feat: Build csi-snapshot-metadata in Dockerfile builder stage
Refactors the Dockerfile to build the csi-snapshot-metadata binary from source in the builder stage, similar to how grpc_health_probe is obtained (via ADD from remote URL). Changes to cmd/csi-snapshot-metadata/Dockerfile: - Use golang:1.24-alpine as builder base (was alpine) - Add TARGETOS and LDFLAGS build arguments - Copy Go source files (go.mod, go.sum, cmd/, pkg/, client/, vendor/) - Build binary in builder with cross-compilation support - Copy built binary from builder (was copying from host filesystem) - Remove obsolete binary ARG Changes to release-tools/build.make: - Replace --build-arg binary with --build-arg LDFLAGS - Remove build-% dependency from push-multiarch-% target (Docker now builds from source, eliminating duplicate compilation) - Fix manifest error detection to handle both error formats: - "manifest for ... not found" (docker.io) - "manifest unknown" (ghcr.io, quay.io) Benefits: - Self-contained builds (no external Makefile dependency for Docker) - True cross-compilation via Docker buildx - Consistent approach (both binaries prepared in builder stage) - Easier for contributors (just docker/podman build) Tested with multiarch build to ghcr.io (amd64, arm64). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent 09dcb69 commit 0e03558

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed
Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,27 @@
1-
FROM alpine AS builder
1+
FROM --platform=$BUILDPLATFORM golang:1.24-alpine AS builder
22
ARG GRPC_HEALTH_PROBE_VERSION=v0.4.37
3-
ADD https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 /bin/grpc_health_probe
3+
ARG TARGETARCH
4+
ARG TARGETOS=linux
5+
ARG LDFLAGS
6+
ADD https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-${TARGETARCH} /bin/grpc_health_probe
47
RUN chmod +x /bin/grpc_health_probe
58

9+
# Build csi-snapshot-metadata
10+
WORKDIR /workspace
11+
COPY go.mod go.sum ./
12+
COPY cmd/ cmd/
13+
COPY pkg/ pkg/
14+
COPY client/ client/
15+
COPY vendor/ vendor/
16+
RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} \
17+
go build -mod=vendor -a -ldflags "${LDFLAGS}" \
18+
-o /bin/csi-snapshot-metadata \
19+
./cmd/csi-snapshot-metadata
20+
621
FROM gcr.io/distroless/static:latest
722
LABEL maintainers="Kubernetes Authors"
823
LABEL description="CSI External Snapshot Metadata Sidecar"
9-
ARG binary=./bin/csi-snapshot-metadata
1024
COPY --from=builder /bin/grpc_health_probe /bin/grpc_health_probe
11-
COPY ${binary} csi-snapshot-metadata
25+
COPY --from=builder /bin/csi-snapshot-metadata /csi-snapshot-metadata
1226
ENTRYPOINT ["/csi-snapshot-metadata"]
1327

release-tools/build.make

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ DOCKER_BUILDX_CREATE_ARGS ?=
146146
# BUILD_PLATFORMS determines which individual images are included in the multiarch image.
147147
# PULL_BASE_REF must be set to 'master', 'main', 'release-x.y', or a tag name, and determines
148148
# the tag for the resulting multiarch image.
149-
$(CMDS:%=push-multiarch-%): push-multiarch-%: check-pull-base-ref build-%
149+
$(CMDS:%=push-multiarch-%): push-multiarch-%: check-pull-base-ref
150150
set -ex; \
151151
export DOCKER_CLI_EXPERIMENTAL=enabled; \
152152
docker buildx create $(DOCKER_BUILDX_CREATE_ARGS) --use --name multiarchimage-buildertest --driver-opt image=moby/buildkit:v0.10.6; \
@@ -167,7 +167,7 @@ $(CMDS:%=push-multiarch-%): push-multiarch-%: check-pull-base-ref build-%
167167
--tag $(IMAGE_NAME):$$escaped_buildx_platform-$$os-$$escaped_base_image$$tag \
168168
--platform=$$os/$$buildx_platform \
169169
--file $$(eval echo \$${dockerfile_$$os}) \
170-
--build-arg binary=./bin/$*$$suffix \
170+
--build-arg LDFLAGS='$(FULL_LDFLAGS)' \
171171
--build-arg ARCH=$$arch \
172172
--build-arg BASE_IMAGE=$$base_image \
173173
--build-arg ADDON_IMAGE=$$addon_image \
@@ -199,7 +199,7 @@ $(CMDS:%=push-multiarch-%): push-multiarch-%: check-pull-base-ref build-%
199199
: "creating or overwriting canary image for release branch"; \
200200
release_canary_tag=$$(echo $(PULL_BASE_REF) | cut -f2 -d '-')-canary; \
201201
pushMultiArch $$release_canary_tag; \
202-
elif docker pull $(IMAGE_NAME):$(PULL_BASE_REF) 2>&1 | tee /dev/stderr | grep -q "manifest for $(IMAGE_NAME):$(PULL_BASE_REF) not found"; then \
202+
elif docker pull $(IMAGE_NAME):$(PULL_BASE_REF) 2>&1 | tee /dev/stderr | grep -qE "(manifest for .* not found|manifest unknown)"; then \
203203
: "creating release image"; \
204204
pushMultiArch $(PULL_BASE_REF); \
205205
else \

0 commit comments

Comments
 (0)