Skip to content

Commit

Permalink
Fix: add hints to help users enable docker experimental features
Browse files Browse the repository at this point in the history
1. Update image.mk to add hints
2. Update Makefile to support make manifest & manifest.multiarch
  • Loading branch information
Shangru-WU authored and QianChenglong committed Feb 27, 2020
1 parent 32e8667 commit e13755e
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 19 deletions.
12 changes: 11 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,21 @@ image.multiarch:
push:
@$(MAKE) image.push

## push.multiarch: Build docker images for multiple platforms and push manifests to registry.
## push.multiarch: Build docker images for multiple platforms and push images to registry.
.PHONY: push.multiarch
push.multiarch:
@$(MAKE) image.push.multiarch

## manifest: Build docker images for linux_amd64 platform and push manifest list to registry.
.PHONY: manifest
manifest:
@$(MAKE) image.manifest.push

## manifest.multiarch: Build docker images for multiple platforms and push manifest lists to registry.
.PHONY: manifest.multiarch
manifest.multiarch:
@$(MAKE) image.manifest.push.multiarch

## deploy: Deploy updated components to development env.
.PHONY: deploy
deploy:
Expand Down
33 changes: 33 additions & 0 deletions build/lib/create-manifest.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/bin/bash

REGISTRY_PREFIX=${REGISTRY_PREFIX:-"tkestack"}
PLATFORMS=${PLATFORMS:-"linux_amd64 linux_arm64"}

if [ -z ${IMAGE} ]; then
echo "Please provide IMAGE."
exit 1
fi

if [ -z ${VERSION} ]; then
echo "Please provide VERSION."
exit 1
fi

rm -rf ${HOME}/.docker/manifests/docker.io_${REGISTRY_PREFIX}_${IMAGE}-${VERSION}
DES_REGISTRY=${REGISTRY_PREFIX}/${IMAGE}
for platform in ${PLATFORMS}; do
os=${platform%_*}
arch=${platform#*_}
variant=""
if [ ${arch} == "arm64" ]; then
variant="--variant unknown"
fi

docker manifest create --amend ${DES_REGISTRY}:${VERSION} \
${DES_REGISTRY}-${arch}:${VERSION}

docker manifest annotate ${DES_REGISTRY}:${VERSION} \
${DES_REGISTRY}-${arch}:${VERSION} \
--os ${os} --arch ${arch} ${variant}
done
docker manifest push --purge ${DES_REGISTRY}:${VERSION}
53 changes: 37 additions & 16 deletions build/lib/image.mk
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,24 @@ image.verify:
ifneq ($(shell $(DOCKER) -v | grep -q -E '\bversion ($(DOCKER_SUPPORTED_VERSIONS))\b' && echo 0 || echo 1), 0)
$(error unsupported docker version. Please make install one of the following supported version: '$(DOCKER_SUPPORTED_VERSIONS)')
endif
@echo "===========> Docker version verification passed"

.PHONY: image.daemon.verify
image.daemon.verify:
ifneq ($(shell $(DOCKER) version | grep -q -E 'Experimental: {5}true' && echo 0 || echo 1), 0)
$(error Experimental features of Docker daemon is not enabled. Please add "experimental": true in '/etc/docker/daemon.json' and then restart Docker daemon.)
endif

.PHONY: image.client.verify
image.client.verify:
ifneq ($(shell $(DOCKER) version | grep -q -E 'Experimental: {6}true' && echo 0 || echo 1), 0)
$(error Experimental features of Docker client is not enabled. Please add "experimental": "enabled" in '$$HOME/.docker/config.json')
endif

.PHONY: image.build
image.build: image.verify go.build.verify $(addprefix image.build., $(addprefix $(IMAGE_PLAT)., $(IMAGES)))
image.build: image.verify image.daemon.verify go.build.verify $(addprefix image.build., $(addprefix $(IMAGE_PLAT)., $(IMAGES)))

.PHONY: image.build.multiarch
image.build.multiarch: image.verify go.build.verify $(foreach p,$(PLATFORMS),$(addprefix image.build., $(addprefix $(p)., $(IMAGES))))
image.build.multiarch: image.verify image.daemon.verify go.build.verify $(foreach p,$(PLATFORMS),$(addprefix image.build., $(addprefix $(p)., $(IMAGES))))

.PHONY: image.build.%
image.build.%: go.build.%
Expand All @@ -72,32 +83,42 @@ image.build.%: go.build.%
@rm -rf $(TMP_DIR)/$(IMAGE)

.PHONY: image.push
image.push: image.verify go.build.verify $(addprefix image.push., $(addprefix $(IMAGE_PLAT)., $(IMAGES)))
image.push: image.verify image.daemon.verify go.build.verify $(addprefix image.push., $(addprefix $(IMAGE_PLAT)., $(IMAGES)))

.PHONY: image.push.multiarch
image.push.multiarch: image.verify image.daemon.verify go.build.verify $(foreach p,$(PLATFORMS),$(addprefix image.push., $(addprefix $(p)., $(IMAGES))))

.PHONY: image.push.%
image.push.%: image.build.%
@echo "===========> Pushing image $(IMAGE) $(VERSION) to $(REGISTRY_PREFIX)"
$(DOCKER) push $(REGISTRY_PREFIX)/$(IMAGE)-$(ARCH):$(VERSION)
@$(DOCKER) manifest create --amend $(REGISTRY_PREFIX)/$(IMAGE):$(VERSION) \

.PHONY: image.manifest.push
image.manifest.push: image.verify image.daemon.verify image.client.verify go.build.verify \
$(addprefix image.manifest.push., $(addprefix $(IMAGE_PLAT)., $(IMAGES)))

.PHONY: image.manifest.push.%
image.manifest.push.%: image.push.% image.manifest.remove.%
@echo "===========> Pushing manifest $(IMAGE) $(VERSION) to $(REGISTRY_PREFIX) and then remove the local manifest list"
@$(DOCKER) manifest create $(REGISTRY_PREFIX)/$(IMAGE):$(VERSION) \
$(REGISTRY_PREFIX)/$(IMAGE)-$(ARCH):$(VERSION)
@$(DOCKER) manifest annotate $(REGISTRY_PREFIX)/$(IMAGE):$(VERSION) \
$(REGISTRY_PREFIX)/$(IMAGE)-$(ARCH):$(VERSION) \
--os $(OS) --arch ${ARCH}

.PHONY: image.push.multiarch
image.push.multiarch: image.verify go.build.verify manifest.remove \
$(foreach p,$(PLATFORMS),$(addprefix image.push., $(addprefix $(p)., $(IMAGES)))) \
$(addprefix image.push.manifest., $(IMAGES))
@$(DOCKER) manifest push --purge $(REGISTRY_PREFIX)/$(IMAGE):$(VERSION)

# Docker cli has a bug: https://github.com/docker/cli/issues/954
# If you find your manifests were not updated,
# Please manually delete them in $HOME/.docker/manifests/
# and re-run.
.PHONY: manifest.remove
manifest.remove:
@rm -rf ${HOME}/.docker/manifests/docker.io_$(REGISTRY_PREFIX)_tke-*
.PHONY: image.manifest.remove.%
image.manifest.remove.%:
@rm -rf ${HOME}/.docker/manifests/docker.io_$(REGISTRY_PREFIX)_$(IMAGE)-$(VERSION)

.PHONY: image.manifest.push.multiarch
image.manifest.push.multiarch: image.client.verify image.push.multiarch $(addprefix image.manifest.push.multiarch., $(IMAGES))

.PHONY: image.push.manifest.%
image.push.manifest.%:
.PHONY: image.manifest.push.multiarch.%
image.manifest.push.multiarch.%:
@echo "===========> Pushing manifest $* $(VERSION) to $(REGISTRY_PREFIX) and then remove the local manifest list"
@$(DOCKER) manifest push --purge $(REGISTRY_PREFIX)/$*:$(VERSION)
REGISTRY_PREFIX=$(REGISTRY_PREFIX) PLATFROMS="$(PLATFORMS)" IMAGE=$* VERSION=$(VERSION) $(ROOT_DIR)/build/lib/create-manifest.sh
4 changes: 2 additions & 2 deletions docs/devel/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ To build container images for multiple platforms (i.e., linux_amd64 and linux_ar
make image.multiarch
```

Above command will use experimental features of docker daemon (i.e. docker build --platform).
Above all `make image` commands will use experimental features of Docker daemon (i.e. docker build --platform).
Please refer to [docker build docs](https://docs.docker.com/engine/reference/commandline/build/#--platform) to enable experimental features.

To build a specific os/arch for TKE container images, please use the `PLATFORMS` environment variable to
Expand All @@ -182,7 +182,7 @@ make push
```

TKEStack manages docker images via manifests and manifest lists.
Please make sure you enable experimental features in the Docker CLI.
Please make sure you enable experimental features in the Docker client.
You can find more details in [docker manifest docs](https://docs.docker.com/engine/reference/commandline/manifest/).

For more functions of other components, please see [here](/docs/devel/components.md). To run tke system locally, please see [here](/docs/devel/running-locally.md).

0 comments on commit e13755e

Please sign in to comment.