Skip to content

Commit bd36e44

Browse files
committed
Use Zstd compression for published images to reduce their size and speedup decompression
1 parent 5bfc5d5 commit bd36e44

File tree

1 file changed

+43
-50
lines changed

1 file changed

+43
-50
lines changed

builder.sh

Lines changed: 43 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ set +u
99

1010
DOCKER_TIMEOUT=20
1111
DOCKER_PID=-1
12+
DOCKER_BUILDX_BUILDER="ha-builder"
1213
DOCKER_HUB=
1314
DOCKER_HUB_CHECK=false
1415
DOCKER_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+
210221
function 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
966958
init_crosscompile
967959
start_docker
960+
create_buildx_builder
968961

969962
# Load external repository
970963
if [ -n "$GIT_REPOSITORY" ]; then

0 commit comments

Comments
 (0)