@@ -13,6 +13,19 @@ OPERATOR_IMAGE ?= cluster-network-addons-operator
13
13
REGISTRY_IMAGE ?= cluster-network-addons-registry
14
14
export OCI_BIN ?= $(shell if podman ps >/dev/null 2>&1; then echo podman; elif docker ps >/dev/null 2>&1; then echo docker; fi)
15
15
TLS_SETTING := $(if $(filter $(OCI_BIN ) ,podman) ,--tls-verify=false,)
16
+ PLATFORMS ?= linux/amd64
17
+ # Set the platforms for building a multi-platform supported image.
18
+ # Example:
19
+ # PLATFORMS ?= linux/amd64,linux/arm64,linux/s390x
20
+ # Alternatively, you can export the PLATFORMS variable like this:
21
+ # export PLATFORMS=linux/arm64,linux/s390x,linux/amd64
22
+ ARCH := $(shell uname -m | sed 's/x86_64/amd64/')
23
+ DOCKER_BUILDER ?= docker-builder
24
+ OPERATOR_IMAGE_TAGGED := $(IMAGE_REGISTRY ) /$(OPERATOR_IMAGE ) :$(IMAGE_TAG )
25
+ NULL :=
26
+ SPACE := $(NULL ) #
27
+ COMMA := ,
28
+ PLATFORM_LIST := $(subst $(COMMA ) ,$(SPACE ) ,$(strip $(PLATFORMS ) ) )
16
29
17
30
TARGETS = \
18
31
gen-k8s \
@@ -26,7 +39,6 @@ TARGETS = \
26
39
export GOFLAGS=-mod =vendor
27
40
export GO111MODULE =on
28
41
GO_VERSION = $(shell hack/go-version.sh)
29
-
30
42
WHAT ?= ./pkg/... ./cmd/... ./tools/...
31
43
32
44
export E2E_TEST_TIMEOUT ?= 3h
@@ -112,16 +124,30 @@ manifest-templator: $(GO)
112
124
113
125
docker-build : docker-build-operator docker-build-registry
114
126
115
- docker-build-operator : manager manifest-templator
116
- $(OCI_BIN ) build -f build/operator/Dockerfile -t $(IMAGE_REGISTRY ) /$(OPERATOR_IMAGE ) :$(IMAGE_TAG ) .
127
+ docker-build-operator :
128
+ ifeq ($(OCI_BIN ) ,podman)
129
+ $(MAKE) build-multiarch-operator-podman
130
+ else ifeq ($(OCI_BIN),docker)
131
+ $(MAKE) build-multiarch-operator-docker
132
+ else
133
+ $(error Unsupported OCI_BIN value: $(OCI_BIN))
134
+ endif
117
135
118
136
docker-build-registry :
119
137
$(OCI_BIN ) build -f build/registry/Dockerfile -t $(IMAGE_REGISTRY ) /$(REGISTRY_IMAGE ) :$(IMAGE_TAG ) .
120
138
121
139
docker-push : docker-push-operator docker-push-registry
122
140
123
141
docker-push-operator :
124
- $(OCI_BIN ) push ${TLS_SETTING} $(IMAGE_REGISTRY ) /$(OPERATOR_IMAGE ) :$(IMAGE_TAG )
142
+ ifeq ($(OCI_BIN ) ,podman)
143
+ podman manifest push ${TLS_SETTING} ${OPERATOR_IMAGE_TAGGED}
144
+ else ifeq ($(OCI_BIN),docker)
145
+ ifeq ($(words $(PLATFORM_LIST ) ) , 1)
146
+ docker push ${TLS_SETTING} ${OPERATOR_IMAGE_TAGGED}
147
+ endif
148
+ else
149
+ $(error Unsupported OCI_BIN value : $(OCI_BIN ) )
150
+ endif
125
151
126
152
docker-push-registry :
127
153
$(OCI_BIN ) push $(IMAGE_REGISTRY ) /$(REGISTRY_IMAGE ) :$(IMAGE_TAG )
@@ -227,9 +253,45 @@ lint-monitoring:
227
253
clean :
228
254
rm -rf $(OUTPUT_DIR )
229
255
256
+ build-multiarch-operator-docker :
257
+ ifeq ($(words $(PLATFORM_LIST ) ) , 1)
258
+ docker build \
259
+ --build-arg BUILD_ARCH=$(ARCH) \
260
+ --platform $(PLATFORMS) \
261
+ -f build/operator/Dockerfile \
262
+ -t ${OPERATOR_IMAGE_TAGGED} .
263
+ else
264
+ ./hack/build-multiarch-operator.sh ${DOCKER_BUILDER}
265
+ docker buildx build \
266
+ --build-arg BUILD_ARCH=$(ARCH) \
267
+ --platform $(PLATFORMS) \
268
+ -f build/operator/Dockerfile \
269
+ -t ${OPERATOR_IMAGE_TAGGED} \
270
+ --push .
271
+ endif
272
+
273
+ build-multiarch-operator-podman :
274
+ # Remove any existing manifest and image
275
+ @podman manifest rm ${OPERATOR_IMAGE_TAGGED} || true
276
+ @podman rmi ${OPERATOR_IMAGE_TAGGED} || true
277
+ # Create a manifest list
278
+ @podman manifest create ${OPERATOR_IMAGE_TAGGED}
279
+ # Loop through each platform and build the image
280
+ $(foreach platform,$(PLATFORM_LIST ) , \
281
+ podman build \
282
+ --no-cache \
283
+ --build-arg BUILD_ARCH=$(ARCH ) \
284
+ --platform $(platform ) \
285
+ --manifest ${OPERATOR_IMAGE_TAGGED} \
286
+ -f build/operator/Dockerfile \
287
+ . ; \
288
+ )
289
+
230
290
.PHONY : \
231
291
$(E2E_SUITES ) \
232
292
all \
293
+ build-multiarch-operator-docker \
294
+ build-multiarch-operator-podman \
233
295
check \
234
296
cluster-clean \
235
297
cluster-down \
0 commit comments