mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-10-31 16:13:45 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			181 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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=}"
 | |
| : "${ENDPOINT=}"
 | |
| : "${MULTI_NODE=0}"
 | |
| : "${PLATFORMS=linux/amd64,linux/arm64}"
 | |
| 
 | |
| function buildxCmd {
 | |
|   (set -x ; $BUILDX_CMD "$@")
 | |
| }
 | |
| 
 | |
| function clean {
 | |
|   rm -rf "$context"
 | |
|   if [ "$builderName" != "default" ]; then
 | |
|     buildxCmd rm "$builderName"
 | |
|   fi
 | |
| }
 | |
| 
 | |
| context=$(mktemp -d -t buildx-output.XXXXXXXXXX)
 | |
| dockerfile=${context}/Dockerfile
 | |
| bakedef=${context}/docker-bake.hcl
 | |
| trap clean EXIT
 | |
| 
 | |
| builderName=buildx-test-$(openssl rand -hex 16)
 | |
| buildPlatformFlag=
 | |
| if [ "$DRIVER" = "docker" ]; then
 | |
|   builderName=default
 | |
| else
 | |
|   buildPlatformFlag=--platform="${PLATFORMS}"
 | |
| fi
 | |
| 
 | |
| if [ "$DRIVER" != "remote" ]; then
 | |
|   driverOpt=${driverOpt:+"${driverOpt},"}image=${BUILDKIT_IMAGE}
 | |
| fi
 | |
| if [ -n "$DRIVER_OPT" ]; then
 | |
|   driverOpt=${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 --buildkitd-config=${BUILDKIT_CFG}"
 | |
|       fi
 | |
|       if [ "$firstNode" = "0" ]; then
 | |
|         createFlags="$createFlags --append"
 | |
|       fi
 | |
|       nodeName=""
 | |
|       if [ "$DRIVER" != "kubernetes" ]; then
 | |
|         nodeName="${builderName}-${platform/\//-}"
 | |
|       fi
 | |
|       buildxCmd create ${createFlags} \
 | |
|         --bootstrap \
 | |
|         --name="${builderName}" \
 | |
|         --node="${nodeName}" \
 | |
|         --platform="${platform}" \
 | |
|         --driver="${DRIVER}" \
 | |
|         ${driverOpt:+"--driver-opt=${driverOpt}"} \
 | |
|         ${ENDPOINT}
 | |
|       firstNode=0
 | |
|     done
 | |
|   else
 | |
|     createFlags=""
 | |
|     if [ -f "$BUILDKIT_CFG" ]; then
 | |
|       createFlags="$createFlags --buildkitd-config=${BUILDKIT_CFG}"
 | |
|     fi
 | |
|     buildxCmd create ${createFlags} \
 | |
|       --bootstrap \
 | |
|       --name="${builderName}" \
 | |
|       --platform="${PLATFORMS}" \
 | |
|       --driver="${DRIVER}" \
 | |
|       ${driverOpt:+"--driver-opt=${driverOpt}"} \
 | |
|       ${ENDPOINT}
 | |
|   fi
 | |
| fi
 | |
| 
 | |
| function buildOutput {
 | |
|   local name=$1
 | |
|   if [ "$DRIVER" != "docker" ]; then
 | |
|     if [ "${MULTI_NODE}" = "1" ]; then
 | |
|       echo "type=cacheonly"
 | |
|     else
 | |
|       echo "type=oci,dest=${context}/${name}.tar"
 | |
|     fi
 | |
|   else
 | |
|     echo "type=docker,name=${name}"
 | |
|   fi
 | |
| }
 | |
| 
 | |
| # multi-platform not supported by docker driver
 | |
| buildPlatformFlag=
 | |
| bakePlatformFlag=
 | |
| if [ "$DRIVER" != "docker" ]; then
 | |
|   buildPlatformFlag=--platform="${PLATFORMS}"
 | |
|   bakePlatformFlag=--set="*.platform=${PLATFORMS}"
 | |
| fi
 | |
| 
 | |
| # inspect and bootstrap
 | |
| buildxCmd inspect --bootstrap --builder="${builderName}"
 | |
| 
 | |
| # create dockerfile
 | |
| cat > "${dockerfile}" <<EOL
 | |
| FROM busybox as build
 | |
| ARG TARGETPLATFORM
 | |
| ARG BUILDPLATFORM
 | |
| RUN echo "I am running on \$BUILDPLATFORM, building for \$TARGETPLATFORM" > /log
 | |
| 
 | |
| FROM busybox AS log
 | |
| COPY --from=build /log /log
 | |
| RUN cat /log
 | |
| RUN uname -a
 | |
| 
 | |
| FROM busybox AS hello
 | |
| RUN echo hello > /hello
 | |
| 
 | |
| FROM scratch
 | |
| COPY --from=log /log /log
 | |
| COPY --from=hello /hello /hello
 | |
| EOL
 | |
| 
 | |
| # build
 | |
| buildxCmd build ${buildPlatformFlag} \
 | |
|   --output="$(buildOutput buildx-test-build)" \
 | |
|   --builder="${builderName}" \
 | |
|   --metadata-file="${context}/metadata-build.json" \
 | |
|   "${context}"
 | |
| cat "${context}/metadata-build.json"
 | |
| 
 | |
| # load to docker store
 | |
| if [ "$DRIVER" != "docker" ]; then
 | |
|   buildxCmd build \
 | |
|     --output="type=docker,name=buildx-test-load" \
 | |
|     --builder="${builderName}" \
 | |
|     "${context}"
 | |
| fi
 | |
| 
 | |
| # create bake def
 | |
| cat > "${bakedef}" <<EOL
 | |
| group "default" {
 | |
|   targets = ["release"]
 | |
| }
 | |
| group "all" {
 | |
|   targets = ["log", "hello"]
 | |
| }
 | |
| target "release" {
 | |
|   output = ["$(buildOutput buildx-test-bake-release)"]
 | |
| }
 | |
| target "log" {
 | |
|   output = ["$(buildOutput buildx-test-bake-log)"]
 | |
| }
 | |
| target "hello" {
 | |
|   output = ["$(buildOutput buildx-test-bake-hello)"]
 | |
| }
 | |
| EOL
 | |
| 
 | |
| # bake default target
 | |
| buildxCmd bake ${bakePlatformFlag} \
 | |
|   --file="${bakedef}" \
 | |
|   --builder="${builderName}" \
 | |
|   --set "*.context=${context}" \
 | |
|   --metadata-file="${context}/metadata-bake-def.json"
 | |
| cat "${context}/metadata-bake-def.json"
 | |
| 
 | |
| # bake all target
 | |
| buildxCmd bake ${bakePlatformFlag} \
 | |
|   --file="${bakedef}" \
 | |
|   --builder="${builderName}" \
 | |
|   --set "*.context=${context}" \
 | |
|   --metadata-file="${context}/metadata-bake-all.json" \
 | |
|   all
 | |
| cat "${context}/metadata-bake-all.json"
 | 
