alpine: Use docker build --iidfile

This was added in 17.06 and allows us to avoid using `$(BASE):build` which is
not safe against parallel builds etc.

Having done this restructure the build to not always delete the built container
and to separate out the `hash` and `version` file rules so that they can be
included in both the `tag` and `push` targets.

Signed-off-by: Ian Campbell <ijc@docker.com>
This commit is contained in:
Ian Campbell 2017-07-20 12:20:50 +01:00
parent 53bd58edc8
commit e015aff65a

View File

@ -6,12 +6,14 @@ IMAGE=alpine
DOCKER_CONTENT_VAR=1 DOCKER_CONTENT_VAR=1
PKG_DEPS=packages PKG_DEPS=packages
ifeq ($(shell uname -m), x86_64) ARCH := $(shell uname -m)
ifeq ($(ARCH), x86_64)
BASE=alpine:3.6 BASE=alpine:3.6
PKG_DEPS += packages.x86_64 PKG_DEPS += packages.x86_64
endif endif
ifeq ($(shell uname -m), aarch64) ifeq ($(ARCH), aarch64)
BASE=arm64v8/alpine:3.6 BASE=arm64v8/alpine:3.6
PKG_DEPS += packages.aarch64 PKG_DEPS += packages.aarch64
DOCKER_CONTENT_VAR=0 DOCKER_CONTENT_VAR=0
@ -20,27 +22,29 @@ endif
default: push default: push
show-tag: show-tag:
@sed -n -e '1s/# \(.*\/.*:[0-9a-f]\{40\}\)/\1/p;q' versions.$(shell uname -m) @sed -n -e '1s/# \(.*\/.*:[0-9a-f]\{40\}\)/\1/p;q' versions.$(ARCH)
hash: Dockerfile Makefile $(PKG_DEPS) iid: Dockerfile Makefile $(PKG_DEPS)
DOCKER_CONTENT_TRUST=$(DOCKER_CONTENT_VAR) docker pull $(BASE) DOCKER_CONTENT_TRUST=$(DOCKER_CONTENT_VAR) docker pull $(BASE)
docker build --no-cache --build-arg BASE=$(BASE) -t $(IMAGE):build . docker build --no-cache --build-arg BASE=$(BASE) --iidfile iid .
docker run --rm $(IMAGE):build sh -c 'echo Dockerfile /lib/apk/db/installed $$(find /mirror -name '*.apk' -type f) $$(find /go/bin -type f) | xargs cat | sha1sum' | sed 's/ .*//' > $@
push: hash hash: Makefile iid
docker run --rm $(shell cat iid) sh -c 'echo Dockerfile /lib/apk/db/installed $$(find /mirror -name '*.apk' -type f) $$(find /go/bin -type f) | xargs cat | sha1sum' | sed 's/ .*//' > $@
versions.$(ARCH): Makefile hash iid
echo "# $(ORG)/$(IMAGE):$(shell cat hash)" > versions.$(ARCH)
docker run --rm $(shell cat iid) find /mirror -name '*.apk' -exec basename '{}' .apk \; | sort | (echo '# automatically generated list of installed packages'; cat -) >> versions.$(ARCH)
push: hash iid versions.$(ARCH)
DOCKER_CONTENT_TRUST=$(DOCKER_CONTENT_VAR) docker pull $(ORG)/$(IMAGE):$(shell cat hash) || \ DOCKER_CONTENT_TRUST=$(DOCKER_CONTENT_VAR) docker pull $(ORG)/$(IMAGE):$(shell cat hash) || \
(docker tag $(IMAGE):build $(ORG)/$(IMAGE):$(shell cat hash) && \ (docker tag $(shell cat iid) $(ORG)/$(IMAGE):$(shell cat hash) && \
DOCKER_CONTENT_TRUST=$(DOCKER_CONTENT_VAR) docker push $(ORG)/$(IMAGE):$(shell cat hash)) DOCKER_CONTENT_TRUST=$(DOCKER_CONTENT_VAR) docker push $(ORG)/$(IMAGE):$(shell cat hash))
echo "# $(ORG)/$(IMAGE):$(shell cat hash)" > versions.$(shell uname -m) rm -f iid
docker run --rm $(IMAGE):build find /mirror -name '*.apk' -exec basename '{}' .apk \; | sort | (echo '# automatically generated list of installed packages'; cat -) >> versions.$(shell uname -m)
docker rmi $(IMAGE):build
rm -f hash
tag: hash tag: hash iid versions.$(ARCH)
docker pull $(ORG)/$(IMAGE):$(shell cat hash) || \ docker pull $(ORG)/$(IMAGE):$(shell cat hash) || \
docker tag $(IMAGE):build $(ORG)/$(IMAGE):$(shell cat hash) docker tag $(shell cat iid) $(ORG)/$(IMAGE):$(shell cat hash)
docker rmi $(IMAGE):build rm -f iid
rm -f hash
clean: clean:
rm -f hash rm -f hash iid