@@ -55,7 +55,7 @@ ifneq ($(shell command -v gotestsum 2> /dev/null),)
5555endif
5656endif
5757
58- PROMU_VERSION ?= 0.17.0
58+ PROMU_VERSION ?= 0.18.1
5959PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz
6060
6161SKIP_GOLANGCI_LINT :=
@@ -90,8 +90,10 @@ ifdef DOCKERFILE_PATH
9090$(error DOCKERFILE_PATH is deprecated. Use DOCKERFILE_VARIANTS ?= $(DOCKERFILE_PATH) in the Makefile)
9191endif
9292
93- DOCKER_ARCHS ?= amd64
94- DOCKERFILE_VARIANTS ?= Dockerfile $(wildcard Dockerfile.*)
93+ DOCKER_ARCHS ?= amd64 armv7 arm64 ppc64le riscv64 s390x
94+ DOCKERFILE_ARCH_EXCLUSIONS ?=
95+ DOCKER_REGISTRY_ARCH_EXCLUSIONS ?= quay.io:riscv64
96+ DOCKERFILE_VARIANTS ?= $(wildcard Dockerfile Dockerfile.*)
9597
9698# Function to extract variant from Dockerfile label.
9799# Returns the variant name from io.prometheus.image.variant label, or "default" if not found.
@@ -109,6 +111,24 @@ endif
109111# Build variant:dockerfile pairs for shell iteration.
110112DOCKERFILE_VARIANTS_WITH_NAMES := $(foreach df,$(DOCKERFILE_VARIANTS),$(call dockerfile_variant,$(df)):$(df))
111113
114+ # Shell helper to check whether a dockerfile/arch pair is excluded.
115+ define dockerfile_arch_is_excluded
116+ case " $(DOCKERFILE_ARCH_EXCLUSIONS) " in \
117+ *" $$dockerfile:$(1) "*) true ;; \
118+ *) false ;; \
119+ esac
120+ endef
121+
122+ # Shell helper to check whether a registry/arch pair is excluded.
123+ # Extracts registry from DOCKER_REPO (e.g., quay.io/prometheus -> quay.io)
124+ define registry_arch_is_excluded
125+ registry=$$(echo "$(DOCKER_REPO)" | cut -d'/' -f1); \
126+ case " $(DOCKER_REGISTRY_ARCH_EXCLUSIONS) " in \
127+ *" $$registry:$(1) "*) true ;; \
128+ *) false ;; \
129+ esac
130+ endef
131+
112132BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS))
113133PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS))
114134TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS))
@@ -250,6 +270,10 @@ $(BUILD_DOCKER_ARCHS): common-docker-%:
250270 @for variant in $(DOCKERFILE_VARIANTS_WITH_NAMES); do \
251271 dockerfile=$${variant#*:}; \
252272 variant_name=$${variant%%:*}; \
273+ if $(call dockerfile_arch_is_excluded,$*); then \
274+ echo "Skipping $$variant_name variant for linux-$* (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
275+ continue; \
276+ fi; \
253277 distroless_arch="$*"; \
254278 if [ "$*" = "armv7" ]; then \
255279 distroless_arch="arm"; \
@@ -284,6 +308,14 @@ $(PUBLISH_DOCKER_ARCHS): common-docker-publish-%:
284308 @for variant in $(DOCKERFILE_VARIANTS_WITH_NAMES); do \
285309 dockerfile=$${variant#*:}; \
286310 variant_name=$${variant%%:*}; \
311+ if $(call dockerfile_arch_is_excluded,$*); then \
312+ echo "Skipping push for $$variant_name variant on linux-$* (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
313+ continue; \
314+ fi; \
315+ if $(call registry_arch_is_excluded,$*); then \
316+ echo "Skipping push for $$variant_name variant on linux-$* to $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
317+ continue; \
318+ fi; \
287319 if [ "$$dockerfile" != "Dockerfile" ] || [ "$$variant_name" != "default" ]; then \
288320 echo "Pushing $$variant_name variant for linux-$*"; \
289321 docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)-$$variant_name"; \
@@ -311,6 +343,14 @@ $(TAG_DOCKER_ARCHS): common-docker-tag-latest-%:
311343 @for variant in $(DOCKERFILE_VARIANTS_WITH_NAMES); do \
312344 dockerfile=$${variant#*:}; \
313345 variant_name=$${variant%%:*}; \
346+ if $(call dockerfile_arch_is_excluded,$*); then \
347+ echo "Skipping tag for $$variant_name variant on linux-$* (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
348+ continue; \
349+ fi; \
350+ if $(call registry_arch_is_excluded,$*); then \
351+ echo "Skipping tag for $$variant_name variant on linux-$* for $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
352+ continue; \
353+ fi; \
314354 if [ "$$dockerfile" != "Dockerfile" ] || [ "$$variant_name" != "default" ]; then \
315355 echo "Tagging $$variant_name variant for linux-$* as latest"; \
316356 docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)-$$variant_name" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest-$$variant_name"; \
@@ -330,23 +370,87 @@ common-docker-manifest:
330370 variant_name=$${variant%%:*}; \
331371 if [ "$$dockerfile" != "Dockerfile" ] || [ "$$variant_name" != "default" ]; then \
332372 echo "Creating manifest for $$variant_name variant"; \
333- DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)-$$variant_name" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(SANITIZED_DOCKER_IMAGE_TAG)-$$variant_name); \
373+ refs=""; \
374+ for arch in $(DOCKER_ARCHS); do \
375+ if $(call dockerfile_arch_is_excluded,$$arch); then \
376+ echo " Skipping $$arch for $$variant_name (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
377+ continue; \
378+ fi; \
379+ if $(call registry_arch_is_excluded,$$arch); then \
380+ echo " Skipping $$arch for $$variant_name on $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
381+ continue; \
382+ fi; \
383+ refs="$$refs $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$$arch:$(SANITIZED_DOCKER_IMAGE_TAG)-$$variant_name"; \
384+ done; \
385+ if [ -z "$$refs" ]; then \
386+ echo "Skipping manifest for $$variant_name variant (no supported architectures)"; \
387+ continue; \
388+ fi; \
389+ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)-$$variant_name" $$refs; \
334390 DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)-$$variant_name"; \
335391 fi; \
336392 if [ "$$dockerfile" = "Dockerfile" ]; then \
337393 echo "Creating default variant ($$variant_name) manifest"; \
338- DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(SANITIZED_DOCKER_IMAGE_TAG)); \
394+ refs=""; \
395+ for arch in $(DOCKER_ARCHS); do \
396+ if $(call dockerfile_arch_is_excluded,$$arch); then \
397+ echo " Skipping $$arch for default variant (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
398+ continue; \
399+ fi; \
400+ if $(call registry_arch_is_excluded,$$arch); then \
401+ echo " Skipping $$arch for default variant on $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
402+ continue; \
403+ fi; \
404+ refs="$$refs $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$$arch:$(SANITIZED_DOCKER_IMAGE_TAG)"; \
405+ done; \
406+ if [ -z "$$refs" ]; then \
407+ echo "Skipping default variant manifest (no supported architectures)"; \
408+ continue; \
409+ fi; \
410+ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" $$refs; \
339411 DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)"; \
340412 fi; \
341413 if [ "$(DOCKER_IMAGE_TAG)" = "latest" ]; then \
342414 if [ "$$dockerfile" != "Dockerfile" ] || [ "$$variant_name" != "default" ]; then \
343415 echo "Creating manifest for $$variant_name variant version tag"; \
344- DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):v$(DOCKER_MAJOR_VERSION_TAG)-$$variant_name" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):v$(DOCKER_MAJOR_VERSION_TAG)-$$variant_name); \
416+ refs=""; \
417+ for arch in $(DOCKER_ARCHS); do \
418+ if $(call dockerfile_arch_is_excluded,$$arch); then \
419+ echo " Skipping $$arch for $$variant_name version tag (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
420+ continue; \
421+ fi; \
422+ if $(call registry_arch_is_excluded,$$arch); then \
423+ echo " Skipping $$arch for $$variant_name version tag on $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
424+ continue; \
425+ fi; \
426+ refs="$$refs $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$$arch:v$(DOCKER_MAJOR_VERSION_TAG)-$$variant_name"; \
427+ done; \
428+ if [ -z "$$refs" ]; then \
429+ echo "Skipping version-tag manifest for $$variant_name variant (no supported architectures)"; \
430+ continue; \
431+ fi; \
432+ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):v$(DOCKER_MAJOR_VERSION_TAG)-$$variant_name" $$refs; \
345433 DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):v$(DOCKER_MAJOR_VERSION_TAG)-$$variant_name"; \
346434 fi; \
347435 if [ "$$dockerfile" = "Dockerfile" ]; then \
348436 echo "Creating default variant version tag manifest"; \
349- DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):v$(DOCKER_MAJOR_VERSION_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):v$(DOCKER_MAJOR_VERSION_TAG)); \
437+ refs=""; \
438+ for arch in $(DOCKER_ARCHS); do \
439+ if $(call dockerfile_arch_is_excluded,$$arch); then \
440+ echo " Skipping $$arch for default variant version tag (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
441+ continue; \
442+ fi; \
443+ if $(call registry_arch_is_excluded,$$arch); then \
444+ echo " Skipping $$arch for default variant version tag on $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
445+ continue; \
446+ fi; \
447+ refs="$$refs $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$$arch:v$(DOCKER_MAJOR_VERSION_TAG)"; \
448+ done; \
449+ if [ -z "$$refs" ]; then \
450+ echo "Skipping default variant version-tag manifest (no supported architectures)"; \
451+ continue; \
452+ fi; \
453+ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):v$(DOCKER_MAJOR_VERSION_TAG)" $$refs; \
350454 DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):v$(DOCKER_MAJOR_VERSION_TAG)"; \
351455 fi; \
352456 fi; \
0 commit comments