@@ -109,6 +109,24 @@ endif
109109# Build variant:dockerfile pairs for shell iteration.
110110DOCKERFILE_VARIANTS_WITH_NAMES := $(foreach df,$(DOCKERFILE_VARIANTS),$(call dockerfile_variant,$(df)):$(df))
111111
112+ # Shell helper to check whether a dockerfile/arch pair is excluded.
113+ define dockerfile_arch_is_excluded
114+ case " $(DOCKERFILE_ARCH_EXCLUSIONS) " in \
115+ *" $$dockerfile:$(1) "*) true ;; \
116+ *) false ;; \
117+ esac
118+ endef
119+
120+ # Shell helper to check whether a registry/arch pair is excluded.
121+ # Extracts registry from DOCKER_REPO (e.g., quay.io/prometheus -> quay.io)
122+ define registry_arch_is_excluded
123+ registry=$$(echo "$(DOCKER_REPO)" | cut -d'/' -f1); \
124+ case " $(DOCKER_REGISTRY_ARCH_EXCLUSIONS) " in \
125+ *" $$registry:$(1) "*) true ;; \
126+ *) false ;; \
127+ esac
128+ endef
129+
112130BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS))
113131PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS))
114132TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS))
@@ -250,6 +268,10 @@ $(BUILD_DOCKER_ARCHS): common-docker-%:
250268 @for variant in $(DOCKERFILE_VARIANTS_WITH_NAMES); do \
251269 dockerfile=$${variant#*:}; \
252270 variant_name=$${variant%%:*}; \
271+ if $(call dockerfile_arch_is_excluded,$*); then \
272+ echo "Skipping $$variant_name variant for linux-$* (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
273+ continue; \
274+ fi; \
253275 distroless_arch="$*"; \
254276 if [ "$*" = "armv7" ]; then \
255277 distroless_arch="arm"; \
@@ -284,6 +306,14 @@ $(PUBLISH_DOCKER_ARCHS): common-docker-publish-%:
284306 @for variant in $(DOCKERFILE_VARIANTS_WITH_NAMES); do \
285307 dockerfile=$${variant#*:}; \
286308 variant_name=$${variant%%:*}; \
309+ if $(call dockerfile_arch_is_excluded,$*); then \
310+ echo "Skipping push for $$variant_name variant on linux-$* (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
311+ continue; \
312+ fi; \
313+ if $(call registry_arch_is_excluded,$*); then \
314+ echo "Skipping push for $$variant_name variant on linux-$* to $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
315+ continue; \
316+ fi; \
287317 if [ "$$dockerfile" != "Dockerfile" ] || [ "$$variant_name" != "default" ]; then \
288318 echo "Pushing $$variant_name variant for linux-$*"; \
289319 docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)-$$variant_name"; \
@@ -311,6 +341,14 @@ $(TAG_DOCKER_ARCHS): common-docker-tag-latest-%:
311341 @for variant in $(DOCKERFILE_VARIANTS_WITH_NAMES); do \
312342 dockerfile=$${variant#*:}; \
313343 variant_name=$${variant%%:*}; \
344+ if $(call dockerfile_arch_is_excluded,$*); then \
345+ echo "Skipping tag for $$variant_name variant on linux-$* (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
346+ continue; \
347+ fi; \
348+ if $(call registry_arch_is_excluded,$*); then \
349+ echo "Skipping tag for $$variant_name variant on linux-$* for $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
350+ continue; \
351+ fi; \
314352 if [ "$$dockerfile" != "Dockerfile" ] || [ "$$variant_name" != "default" ]; then \
315353 echo "Tagging $$variant_name variant for linux-$* as latest"; \
316354 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 +368,87 @@ common-docker-manifest:
330368 variant_name=$${variant%%:*}; \
331369 if [ "$$dockerfile" != "Dockerfile" ] || [ "$$variant_name" != "default" ]; then \
332370 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); \
371+ refs=""; \
372+ for arch in $(DOCKER_ARCHS); do \
373+ if $(call dockerfile_arch_is_excluded,$$arch); then \
374+ echo " Skipping $$arch for $$variant_name (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
375+ continue; \
376+ fi; \
377+ if $(call registry_arch_is_excluded,$$arch); then \
378+ echo " Skipping $$arch for $$variant_name on $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
379+ continue; \
380+ fi; \
381+ refs="$$refs $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$$arch:$(SANITIZED_DOCKER_IMAGE_TAG)-$$variant_name"; \
382+ done; \
383+ if [ -z "$$refs" ]; then \
384+ echo "Skipping manifest for $$variant_name variant (no supported architectures)"; \
385+ continue; \
386+ fi; \
387+ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)-$$variant_name" $$refs; \
334388 DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)-$$variant_name"; \
335389 fi; \
336390 if [ "$$dockerfile" = "Dockerfile" ]; then \
337391 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)); \
392+ refs=""; \
393+ for arch in $(DOCKER_ARCHS); do \
394+ if $(call dockerfile_arch_is_excluded,$$arch); then \
395+ echo " Skipping $$arch for default variant (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
396+ continue; \
397+ fi; \
398+ if $(call registry_arch_is_excluded,$$arch); then \
399+ echo " Skipping $$arch for default variant on $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
400+ continue; \
401+ fi; \
402+ refs="$$refs $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$$arch:$(SANITIZED_DOCKER_IMAGE_TAG)"; \
403+ done; \
404+ if [ -z "$$refs" ]; then \
405+ echo "Skipping default variant manifest (no supported architectures)"; \
406+ continue; \
407+ fi; \
408+ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" $$refs; \
339409 DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)"; \
340410 fi; \
341411 if [ "$(DOCKER_IMAGE_TAG)" = "latest" ]; then \
342412 if [ "$$dockerfile" != "Dockerfile" ] || [ "$$variant_name" != "default" ]; then \
343413 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); \
414+ refs=""; \
415+ for arch in $(DOCKER_ARCHS); do \
416+ if $(call dockerfile_arch_is_excluded,$$arch); then \
417+ echo " Skipping $$arch for $$variant_name version tag (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
418+ continue; \
419+ fi; \
420+ if $(call registry_arch_is_excluded,$$arch); then \
421+ echo " Skipping $$arch for $$variant_name version tag on $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
422+ continue; \
423+ fi; \
424+ refs="$$refs $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$$arch:v$(DOCKER_MAJOR_VERSION_TAG)-$$variant_name"; \
425+ done; \
426+ if [ -z "$$refs" ]; then \
427+ echo "Skipping version-tag manifest for $$variant_name variant (no supported architectures)"; \
428+ continue; \
429+ fi; \
430+ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):v$(DOCKER_MAJOR_VERSION_TAG)-$$variant_name" $$refs; \
345431 DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):v$(DOCKER_MAJOR_VERSION_TAG)-$$variant_name"; \
346432 fi; \
347433 if [ "$$dockerfile" = "Dockerfile" ]; then \
348434 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)); \
435+ refs=""; \
436+ for arch in $(DOCKER_ARCHS); do \
437+ if $(call dockerfile_arch_is_excluded,$$arch); then \
438+ echo " Skipping $$arch for default variant version tag (excluded by DOCKERFILE_ARCH_EXCLUSIONS)"; \
439+ continue; \
440+ fi; \
441+ if $(call registry_arch_is_excluded,$$arch); then \
442+ echo " Skipping $$arch for default variant version tag on $(DOCKER_REPO) (excluded by DOCKER_REGISTRY_ARCH_EXCLUSIONS)"; \
443+ continue; \
444+ fi; \
445+ refs="$$refs $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$$arch:v$(DOCKER_MAJOR_VERSION_TAG)"; \
446+ done; \
447+ if [ -z "$$refs" ]; then \
448+ echo "Skipping default variant version-tag manifest (no supported architectures)"; \
449+ continue; \
450+ fi; \
451+ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):v$(DOCKER_MAJOR_VERSION_TAG)" $$refs; \
350452 DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):v$(DOCKER_MAJOR_VERSION_TAG)"; \
351453 fi; \
352454 fi; \
0 commit comments