From cc53eceda2cba3be48e55627d8b261adb4673af5 Mon Sep 17 00:00:00 2001 From: Nick Sweeting Date: Mon, 13 Mar 2023 06:55:28 -0600 Subject: [PATCH] recreate dockerx builder if missing platforms --- bin/build_docker.sh | 59 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/bin/build_docker.sh b/bin/build_docker.sh index 39b7afb1..9377e201 100755 --- a/bin/build_docker.sh +++ b/bin/build_docker.sh @@ -11,27 +11,62 @@ set -o pipefail IFS=$'\n' REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )" +cd "$REPO_DIR" +which docker > /dev/null || exit 1 + + +TAG_NAME="dev" VERSION="$(jq -r '.version' < "$REPO_DIR/package.json")" SHORT_VERSION="$(echo "$VERSION" | perl -pe 's/(\d+)\.(\d+)\.(\d+)/$1.$2/g')" -TAG_NAME="dev" -cd "$REPO_DIR" +REQUIRED_PLATFORMS=('linux/arm64','linux/amd64','linux/arm/v8','linux/arm/v7') -which docker > /dev/null +function check_platforms() { + INSTALLED_PLATFORMS="$(docker buildx inspect | grep 'Platforms:' )" + + for REQUIRED_PLATFORM in ${REQUIRED_PLATFORMS//,/$IFS}; do + echo "[+] Checking for: $REQUIRED_PLATFORM..." + if ! (echo "$INSTALLED_PLATFORMS" | grep -q "$REQUIRED_PLATFORM"); then + return 1 + fi + done + echo + return 0 +} + +function create_builder() { + echo "[+] Creating new xbuilder for: $REQUIRED_PLATFORMS" + echo + + # Switch to buildx builder if already present / previously created + docker buildx create --name xbuilder --driver docker-container --bootstrap --use --platform "$REQUIRED_PLATFORMS" || true + docker buildx inspect --bootstrap || true + + echo +} + +function recreate_builder() { + # Install QEMU binaries for cross-platform building if not installed + docker run --privileged --rm 'tonistiigi/binfmt' --install all + + # remove existing xbuilder + docker buildx stop xbuilder || true + docker buildx rm xbuilder || true + + # Create Docker builder for cross-platform building + docker buildx use xbuilder && return 0 + + create_builder +} -# Install QEMU binaries for cross-platform building -docker run --privileged --rm tonistiigi/binfmt --install all || true - -# Create Docker builder for cross-platform building -docker buildx use xbuilder || docker buildx create --name xbuilder --driver docker-container --bootstrap --use - -# Verify that amd64 and arm64 support are all present -docker buildx inspect | grep 'amd64.*arm64' || exit 1 +# Check if docker is ready for cross-plaform builds, if not, recreate builder +docker buildx use xbuilder || create_builder +check_platforms || (recreate_builder && check_platforms) || exit 1 echo "[+] Building archivebox:$VERSION docker image..." #docker build . \ -docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --push . \ +docker buildx build --platform "$REQUIRED_PLATFORMS" --push . \ -t archivebox \ -t archivebox:$TAG_NAME \ -t archivebox:$VERSION \