github.com/docker/buildx@v0.14.1-0.20240514123050-afcb609966dc/hack/test-driver (about) 1 #!/usr/bin/env bash 2 3 set -eu -o pipefail 4 5 : "${BUILDX_CMD=docker buildx}" 6 : "${BUILDKIT_IMAGE=moby/buildkit:buildx-stable-1}" 7 : "${BUILDKIT_CFG=}" 8 : "${DRIVER=docker-container}" 9 : "${DRIVER_OPT=}" 10 : "${ENDPOINT=}" 11 : "${MULTI_NODE=0}" 12 : "${PLATFORMS=linux/amd64,linux/arm64}" 13 14 function buildxCmd { 15 (set -x ; $BUILDX_CMD "$@") 16 } 17 18 function clean { 19 rm -rf "$context" 20 if [ "$builderName" != "default" ]; then 21 buildxCmd rm "$builderName" 22 fi 23 } 24 25 context=$(mktemp -d -t buildx-output.XXXXXXXXXX) 26 dockerfile=${context}/Dockerfile 27 bakedef=${context}/docker-bake.hcl 28 trap clean EXIT 29 30 builderName=buildx-test-$(openssl rand -hex 16) 31 buildPlatformFlag= 32 if [ "$DRIVER" = "docker" ]; then 33 builderName=default 34 else 35 buildPlatformFlag=--platform="${PLATFORMS}" 36 fi 37 38 if [ "$DRIVER" != "remote" ]; then 39 driverOpt=${driverOpt:+"${driverOpt},"}image=${BUILDKIT_IMAGE} 40 fi 41 if [ -n "$DRIVER_OPT" ]; then 42 driverOpt=${driverOpt:+"${driverOpt},"}$DRIVER_OPT 43 fi 44 45 # create builder except for docker driver 46 if [ "$DRIVER" != "docker" ]; then 47 if [ "${MULTI_NODE}" = "1" ]; then 48 firstNode=1 49 for platform in ${PLATFORMS//,/ }; do 50 createFlags="" 51 if [ -f "$BUILDKIT_CFG" ]; then 52 createFlags="$createFlags --buildkitd-config=${BUILDKIT_CFG}" 53 fi 54 if [ "$firstNode" = "0" ]; then 55 createFlags="$createFlags --append" 56 fi 57 nodeName="" 58 if [ "$DRIVER" != "kubernetes" ]; then 59 nodeName="${builderName}-${platform/\//-}" 60 fi 61 buildxCmd create ${createFlags} \ 62 --bootstrap \ 63 --name="${builderName}" \ 64 --node="${nodeName}" \ 65 --platform="${platform}" \ 66 --driver="${DRIVER}" \ 67 ${driverOpt:+"--driver-opt=${driverOpt}"} \ 68 ${ENDPOINT} 69 firstNode=0 70 done 71 else 72 createFlags="" 73 if [ -f "$BUILDKIT_CFG" ]; then 74 createFlags="$createFlags --buildkitd-config=${BUILDKIT_CFG}" 75 fi 76 buildxCmd create ${createFlags} \ 77 --bootstrap \ 78 --name="${builderName}" \ 79 --platform="${PLATFORMS}" \ 80 --driver="${DRIVER}" \ 81 ${driverOpt:+"--driver-opt=${driverOpt}"} \ 82 ${ENDPOINT} 83 fi 84 fi 85 86 function buildOutput { 87 local name=$1 88 if [ "$DRIVER" != "docker" ]; then 89 if [ "${MULTI_NODE}" = "1" ]; then 90 echo "type=cacheonly" 91 else 92 echo "type=oci,dest=${context}/${name}.tar" 93 fi 94 else 95 echo "type=docker,name=${name}" 96 fi 97 } 98 99 # multi-platform not supported by docker driver 100 buildPlatformFlag= 101 bakePlatformFlag= 102 if [ "$DRIVER" != "docker" ]; then 103 buildPlatformFlag=--platform="${PLATFORMS}" 104 bakePlatformFlag=--set="*.platform=${PLATFORMS}" 105 fi 106 107 # inspect and bootstrap 108 buildxCmd inspect --bootstrap --builder="${builderName}" 109 110 # create dockerfile 111 cat > "${dockerfile}" <<EOL 112 FROM busybox as build 113 ARG TARGETPLATFORM 114 ARG BUILDPLATFORM 115 RUN echo "I am running on \$BUILDPLATFORM, building for \$TARGETPLATFORM" > /log 116 117 FROM busybox AS log 118 COPY --from=build /log /log 119 RUN cat /log 120 RUN uname -a 121 122 FROM busybox AS hello 123 RUN echo hello > /hello 124 125 FROM scratch 126 COPY --from=log /log /log 127 COPY --from=hello /hello /hello 128 EOL 129 130 # build 131 buildxCmd build ${buildPlatformFlag} \ 132 --output="$(buildOutput buildx-test-build)" \ 133 --builder="${builderName}" \ 134 --metadata-file="${context}/metadata-build.json" \ 135 "${context}" 136 cat "${context}/metadata-build.json" 137 138 # load to docker store 139 if [ "$DRIVER" != "docker" ]; then 140 buildxCmd build \ 141 --output="type=docker,name=buildx-test-load" \ 142 --builder="${builderName}" \ 143 "${context}" 144 fi 145 146 # create bake def 147 cat > "${bakedef}" <<EOL 148 group "default" { 149 targets = ["release"] 150 } 151 group "all" { 152 targets = ["log", "hello"] 153 } 154 target "release" { 155 output = ["$(buildOutput buildx-test-bake-release)"] 156 } 157 target "log" { 158 output = ["$(buildOutput buildx-test-bake-log)"] 159 } 160 target "hello" { 161 output = ["$(buildOutput buildx-test-bake-hello)"] 162 } 163 EOL 164 165 # bake default target 166 buildxCmd bake ${bakePlatformFlag} \ 167 --file="${bakedef}" \ 168 --builder="${builderName}" \ 169 --set "*.context=${context}" \ 170 --metadata-file="${context}/metadata-bake-def.json" 171 cat "${context}/metadata-bake-def.json" 172 173 # bake all target 174 buildxCmd bake ${bakePlatformFlag} \ 175 --file="${bakedef}" \ 176 --builder="${builderName}" \ 177 --set "*.context=${context}" \ 178 --metadata-file="${context}/metadata-bake-all.json" \ 179 all 180 cat "${context}/metadata-bake-all.json"