99
1010DOCKER_TIMEOUT=20
1111DOCKER_PID=-1
12+ DOCKER_BUILDX_BUILDER=" ha-builder"
1213DOCKER_HUB=
1314DOCKER_HUB_CHECK=false
1415DOCKER_CACHE=true
@@ -207,6 +208,16 @@ function stop_docker() {
207208}
208209
209210
211+ function create_buildx_builder() {
212+ bashio::log.info " Creating buildx builder: ${DOCKER_BUILDX_BUILDER} ..."
213+ if ! docker inspect " ${DOCKER_BUILDX_BUILDER} " > /dev/null 2>&1 ; then
214+ if ! docker buildx create --name " ${DOCKER_BUILDX_BUILDER} " > /dev/null; then
215+ bashio::exit.nok " Failed to create buildx builder"
216+ fi
217+ fi
218+ }
219+
220+
210221function run_build() {
211222 local build_dir=$1
212223 local repository=$2
@@ -218,7 +229,6 @@ function run_build() {
218229 local docker_tags=(" ${! 8} " )
219230 local shadow_repository=${9}
220231
221- local push_images=()
222232 local cache_tag=" latest"
223233 local metadata
224234 local release=" ${version} "
@@ -319,14 +329,43 @@ function run_build() {
319329 dockerfile=" ${build_dir} /Dockerfile.${build_arch} "
320330 fi
321331
332+ # Tag latest
333+ if bashio::var.true " ${DOCKER_LATEST} " ; then
334+ docker_tags+=(" latest" )
335+ fi
336+
337+ # Add additional tags
338+ for tag_image in " ${ADDITIONAL_TAGS[@]} " ; do
339+ docker_tags+=(" ${tag_image} " )
340+ done
341+
342+ # Use shadow repository
343+ if bashio::var.has_value " ${shadow_repository} " ; then
344+ bashio::log.info " Generate repository shadow images"
345+ shadow_tags=(" ${shadow_repository} /${image} :${version} " )
346+ for tag_image in " ${docker_tags[@]} " ; do
347+ bashio::log.info " Create shadow-image tag: ${shadow_repository} /${image} :${tag_image} "
348+ shadow_tags+=(" ${shadow_repository} /${image} :${tag_image} " )
349+ done
350+ docker_tags+=(" ${shadow_tags[@]} " )
351+ fi
352+
353+ # Tag images
354+ for tag_image in " ${docker_tags[@]} " ; do
355+ docker_cli+=(--tag " ${tag_image} " )
356+ done
357+
322358 # Build image
323359 bashio::log.info " Run build for ${repository} /${image} :${version} with platform ${docker_platform} "
324360 ${docker_wrapper} docker buildx build --pull --tag " ${repository} /${image} :${version} " \
361+ --builder " ${DOCKER_BUILDX_BUILDER} " \
325362 --platform " ${docker_platform} " \
326363 --build-arg " BUILD_FROM=${build_from} " \
327364 --build-arg " BUILD_VERSION=${version} " \
328365 --build-arg " BUILD_ARCH=${build_arch} " \
329366 --file " ${dockerfile} " \
367+ --output " type=image,oci-mediatypes=true,compression=zstd,push=${DOCKER_PUSH} " \
368+ --load \
330369 " ${docker_cli[@]} " \
331370 " ${build_dir} "
332371
@@ -337,57 +376,10 @@ function run_build() {
337376 return 0
338377 fi
339378
340- push_images+=(" ${repository} /${image} :${version} " )
341379 bashio::log.info " Finish build for ${repository} /${image} :${version} "
342380
343- # Tag latest
344- if bashio::var.true " ${DOCKER_LATEST} " ; then
345- docker_tags+=(" latest" )
346- fi
347-
348- # Add additional tags
349- for tag_image in " ${ADDITIONAL_TAGS[@]} " ; do
350- docker_tags+=(" ${tag_image} " )
351- done
352-
353- # Tag images
354- for tag_image in " ${docker_tags[@]} " ; do
355- bashio::log.info " Create image tag: ${tag_image} "
356- docker tag " ${repository} /${image} :${version} " " ${repository} /${image} :${tag_image} "
357- push_images+=(" ${repository} /${image} :${tag_image} " )
358- done
359-
360- # Use shaddow repository
361- if bashio::var.has_value " ${shadow_repository} " ; then
362- bashio::log.info " Generate repository shadow images"
363- docker tag " ${repository} /${image} :${version} " " ${shadow_repository} /${image} :${version} "
364- for tag_image in " ${docker_tags[@]} " ; do
365- bashio::log.info " Create shadow-image tag: ${shadow_repository} /${image} :${tag_image} "
366- docker tag " ${repository} /${image} :${version} " " ${shadow_repository} /${image} :${tag_image} "
367- push_images+=(" ${shadow_repository} /${image} :${tag_image} " )
368- done
369- push_images+=(" ${shadow_repository} /${image} :${version} " )
370- fi
371-
372- # Push images
373- if bashio::var.true " ${DOCKER_PUSH} " ; then
374- for i in " ${push_images[@]} " ; do
375- for j in {1..3}; do
376- bashio::log.info " Start upload of ${i} (attempt #${j} /3)"
377- if docker push " ${i} " > /dev/null 2>&1 ; then
378- bashio::log.info " Upload succeeded on attempt #${j} "
379- break
380- fi
381- if [[ " ${j} " == " 3" ]]; then
382- bashio::exit.nok " Upload failed on attempt #${j} "
383- else
384- bashio::log.warning " Upload failed on attempt #${j} "
385- sleep 30
386- fi
387- done
388- done
389-
390- # Singing image (cosign)
381+ # Sign image (cosign)
382+ if bashio::var.true " ${DOCKER_PUSH} " && bashio::var.true " ${COSIGN} " ; then
391383 if bashio::var.true " ${COSIGN} " ; then
392384 image_digest=$( docker inspect --format=' {{index .RepoDigests 0}}' " ${repository} /${image} :${version} " )
393385 cosign_sign " ${image_digest} "
@@ -965,6 +957,7 @@ mkdir -p /data
965957# Setup docker env
966958init_crosscompile
967959start_docker
960+ create_buildx_builder
968961
969962# Load external repository
970963if [ -n " $GIT_REPOSITORY " ]; then
0 commit comments