diff --git a/Dockerfile b/Dockerfile index 3b191b2f3e..a065ec3459 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,22 +13,19 @@ # limitations under the License. # builder image +ARG ARCH FROM golang:1.14 as builder +ARG ARCH WORKDIR /sigs.k8s.io/external-dns COPY . . -RUN go mod vendor && \ - make test && \ - make build +RUN make test && make build.$ARCH # final image -FROM alpine:3.12 -LABEL maintainer="Team Teapot @ Zalando SE " - -RUN apk add --update --no-cache ca-certificates && \ - update-ca-certificates +FROM $ARCH/alpine:3.12 +COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt COPY --from=builder /sigs.k8s.io/external-dns/build/external-dns /bin/external-dns # Run as UID for nobody since k8s pod securityContext runAsNonRoot can't resolve the user ID: diff --git a/Makefile b/Makefile index 8f09d6c855..c681299d02 100644 --- a/Makefile +++ b/Makefile @@ -68,17 +68,40 @@ IMAGE ?= us.gcr.io/k8s-artifacts-prod/external-dns/$(BINARY) VERSION ?= $(shell git describe --tags --always --dirty) BUILD_FLAGS ?= -v LDFLAGS ?= -X sigs.k8s.io/external-dns/pkg/apis/externaldns.Version=$(VERSION) -w -s +ARCHS = arm64v8 amd64 +SHELL = /bin/bash + build: build/$(BINARY) build/$(BINARY): $(SOURCES) CGO_ENABLED=0 go build -o build/$(BINARY) $(BUILD_FLAGS) -ldflags "$(LDFLAGS)" . +build.push/multiarch: + arch_specific_tags=() + for arch in $(ARCHS); do \ + image="$(IMAGE):$(VERSION)-$${arch}" ;\ + DOCKER_BUILDKIT=1 docker build --rm --tag $${image} --build-arg VERSION="$(VERSION)" --build-arg ARCH="$${arch}" . ;\ + docker push $${image} ;\ + arch_specific_tags+=( "--amend $${image}" ) ;\ + done ;\ + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create "$(IMAGE):$(VERSION)" $${arch_specific_tags[@]} ;\ + for arch in $(ARCHS); do \ + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest annotate --arch $${arch} "$(IMAGE):$(VERSION)" "$(IMAGE):$(VERSION)-$${arch}" ;\ + done;\ + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(IMAGE):$(VERSION)" \ + build.push: build.docker docker push "$(IMAGE):$(VERSION)" +build.arm64v8: + CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o build/$(BINARY) $(BUILD_FLAGS) -ldflags "$(LDFLAGS)" . + +build.amd64: + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o build/$(BINARY) $(BUILD_FLAGS) -ldflags "$(LDFLAGS)" . + build.docker: - docker build --rm --tag "$(IMAGE):$(VERSION)" --build-arg VERSION="$(VERSION)" . + docker build --rm --tag "$(IMAGE):$(VERSION)" --build-arg VERSION="$(VERSION)" --build-arg ARCH="amd64" . build.mini: docker build --rm --tag "$(IMAGE):$(VERSION)-mini" --build-arg VERSION="$(VERSION)" -f Dockerfile.mini . @@ -90,7 +113,7 @@ clean: .PHONY: release.staging release.staging: - IMAGE=$(IMAGE_STAGING) $(MAKE) build.docker build.push + IMAGE=$(IMAGE_STAGING) $(MAKE) build.push/multiarch release.prod: - $(MAKE) build.docker build.push + $(MAKE) build.push/multiarch