#!/usr/bin/env bash set -eu -o pipefail : ${BUILDX_CMD=docker buildx} : ${BUILDKIT_IMAGE=moby/buildkit:buildx-stable-1} : ${BUILDKIT_CFG=} : ${DRIVER=docker-container} : ${DRIVER_OPT=} : ${MULTI_NODE=0} : ${PLATFORMS=linux/amd64,linux/arm64} function clean { rm -rf "$context" ${BUILDX_CMD} rm "$builderName" } context=$(mktemp -d -t buildx-output.XXXXXXXXXX) dockerfile=${context}/Dockerfile trap clean EXIT builderName=buildx-test-$(openssl rand -hex 16) buildPlatformFlag= if [ "$DRIVER" = "docker" ]; then builderName=default else buildPlatformFlag=--platform="${PLATFORMS}" fi driverOpt=image=${BUILDKIT_IMAGE} if [ -n "$DRIVER_OPT" ]; then driverOpt=$driverOpt,$DRIVER_OPT fi # create builder except for docker driver if [ "$DRIVER" != "docker" ]; then if [ "${MULTI_NODE}" = "1" ]; then firstNode=1 for platform in ${PLATFORMS//,/ }; do createFlags="" if [ -f "$BUILDKIT_CFG" ]; then createFlags="$createFlags --config=${BUILDKIT_CFG}" fi if [ "$firstNode" = "0" ]; then createFlags="$createFlags --append" fi ( set -x ${BUILDX_CMD} create ${createFlags} \ --name="${builderName}" \ --node="${builderName}-${platform/\//-}" \ --driver="${DRIVER}" \ --driver-opt="${driverOpt}" \ --platform="${platform}" ) firstNode=0 done else createFlags="" if [ -f "$BUILDKIT_CFG" ]; then createFlags="$createFlags --config=${BUILDKIT_CFG}" fi ( set -x ${BUILDX_CMD} create ${createFlags} \ --name="${builderName}" \ --driver="${DRIVER}" \ --driver-opt="${driverOpt}" \ --platform="${PLATFORMS}" ) fi fi # multi-platform not supported by docker driver buildPlatformFlag= if [ "$DRIVER" != "docker" ]; then buildPlatformFlag=--platform="${PLATFORMS}" fi set -x # inspect and bootstrap ${BUILDX_CMD} inspect --bootstrap --builder="${builderName}" # create dockerfile cat > "${dockerfile}" < /log FROM busybox COPY --from=build /log /log RUN cat /log RUN uname -a EOL # build ${BUILDX_CMD} build ${buildPlatformFlag} \ --output="type=cacheonly" \ --builder="${builderName}" \ "${context}"