diff --git a/cluster/images/etcd/Dockerfile b/cluster/images/etcd/Dockerfile index a72c303edfa..94d2abeffa9 100644 --- a/cluster/images/etcd/Dockerfile +++ b/cluster/images/etcd/Dockerfile @@ -16,4 +16,5 @@ FROM BASEIMAGE MAINTAINER Dawn Chen EXPOSE 2379 2380 4001 7001 -COPY etcd etcdctl migrate-if-needed.sh attachlease /usr/local/bin/ +COPY etcd* etcdctl* /usr/local/bin/ +COPY migrate-if-needed.sh attachlease /usr/local/bin/ diff --git a/cluster/images/etcd/Makefile b/cluster/images/etcd/Makefile index 10453b6cb28..6aae91c9dc4 100644 --- a/cluster/images/etcd/Makefile +++ b/cluster/images/etcd/Makefile @@ -15,10 +15,19 @@ # Build the etcd image # # Usage: -# [TAG=3.0.4] [REGISTRY=gcr.io/google_containers] [ARCH=amd64] [BASEIMAGE=busybox] make (build|push) +# [TAGS=2.2.1 2.3.7 3.0.10] [REGISTRY=gcr.io/google_containers] [ARCH=amd64] [BASEIMAGE=busybox] make (build|push) -TAG?=3.0.4 -REGISTRY_TAG?=$(TAG) +# The image contains different etcd versions to simplify +# upgrades. Thus be careful when removing any tag from here. +# +# NOTE: The etcd upgrade rules are that you can upgrade only 1 minor +# version at a time, and patch release don't matter. +# +# Except from etcd-$(tag) and etcdctl-$(tag) binaries, we also +# need etcd and etcdctl binaries for backward compatibility reasons. +# That binary will be set to the last tag from $(TAGS). +TAGS?=2.2.1 2.3.7 3.0.10 +REGISTRY_TAG?=3.0.10 ARCH?=amd64 REGISTRY?=gcr.io/google_containers GOLANG_VERSION?=1.6.3 @@ -50,16 +59,30 @@ build: ifeq ($(ARCH),amd64) # Do not compile if we should make an image for amd64, use the official etcd binaries instead - curl -sSL --retry 5 https://github.com/coreos/etcd/releases/download/v$(TAG)/etcd-v$(TAG)-linux-amd64.tar.gz | tar -xz -C $(TEMP_DIR) --strip-components=1 + # For each release create a tmp dir 'etcd_release_tmp_dir' and unpack the release tar there. + for tag in $(TAGS); do \ + etcd_release_tmp_dir=$(shell mktemp -d); \ + curl -sSL --retry 5 https://github.com/coreos/etcd/releases/download/v$$tag/etcd-v$$tag-linux-amd64.tar.gz | tar -xz -C $$etcd_release_tmp_dir --strip-components=1; \ + cp $$etcd_release_tmp_dir/etcd $$etcd_release_tmp_dir/etcdctl $(TEMP_DIR)/; \ + cp $(TEMP_DIR)/etcd $(TEMP_DIR)/etcd-$$tag; \ + cp $(TEMP_DIR)/etcdctl $(TEMP_DIR)/etcdctl-$$tag; \ + done else # Download etcd in a golang container and cross-compile it statically - docker run -it -v $(TEMP_DIR):/etcdbin golang:$(GOLANG_VERSION) /bin/bash -c \ - "git clone https://github.com/coreos/etcd /go/src/github.com/coreos/etcd \ - && cd /go/src/github.com/coreos/etcd \ - && git checkout v$(TAG) \ - && GOARM=$(GOARM) GOARCH=$(ARCH) ./build \ - && cp -f bin/$(ARCH)/etcd* bin/etcd* /etcdbin; echo 'done'" + # For each release create a tmp dir 'etcd_release_tmp_dir' and unpack the release tar there. + for tag in $(TAGS); do \ + etcd_release_tmp_dir=$(shell mktemp -d); \ + docker run -it -v $$etcd_release_tmp_dir:/etcdbin golang:$(GOLANG_VERSION) /bin/bash -c \ + "git clone https://github.com/coreos/etcd /go/src/github.com/coreos/etcd \ + && cd /go/src/github.com/coreos/etcd \ + && git checkout v$$tag \ + && GOARM=$(GOARM) GOARCH=$(ARCH) ./build \ + && cp -f bin/$(ARCH)/etcd* bin/etcd* /etcdbin; echo 'done'"; \ + cp $$etcd_release_tmp_dir/etcd $$etcd_release_tmp_dir/etcdctl $(TEMP_DIR)/; \ + cp $(TEMP_DIR)/etcd $(TEMP_DIR)/etcd-$$tag; \ + cp $(TEMP_DIR)/etcdctl $(TEMP_DIR)/etcdctl-$$tag; \ + done # Add this ENV variable in order to workaround an unsupported arch blocker # The multiarch feature is in an limited and experimental state right now, and etcd should work fine on arm64