#!/usr/bin/env bash # Erlang builder + runtime в registry (git.sabilin.com/eventhub/*:latest). # # Usage: # ./scripts/build-erlang-base-images.sh # pull latest или собрать локально # ./scripts/build-erlang-base-images.sh --push # + push :latest в registry # ./scripts/build-erlang-base-images.sh --force-build # пересобрать без pull set -euo pipefail PUSH=0 FORCE=0 for arg in "$@"; do case "${arg}" in --push) PUSH=1 ;; --force-build) FORCE=1 ;; esac done REGISTRY="${REGISTRY:-git.sabilin.com/eventhub}" ROOT="$(cd "$(dirname "$0")/.." && pwd)" BUILDER="${REGISTRY}/erlang-builder:latest" RUNTIME="${REGISTRY}/erlang-runtime:latest" check_alpine_sync() { local erlang_ver runtime_ver erlang_mm erlang_ver="$(docker run --rm erlang:28-alpine cat /etc/alpine-release)" runtime_ver="$(grep '^ARG ALPINE_VERSION=' "${ROOT}/docker/erlang/Dockerfile.runtime" | cut -d= -f2)" erlang_mm="$(echo "${erlang_ver}" | cut -d. -f1-2)" if [[ "${erlang_mm}" != "${runtime_ver}" ]]; then echo "ERROR: erlang:28-alpine uses Alpine ${erlang_ver}, runtime pins ${runtime_ver}" echo " Обновите ALPINE_VERSION в docker/erlang/Dockerfile.runtime" exit 1 fi echo "Alpine sync OK: ${erlang_mm} (erlang image ${erlang_ver})" } build_one() { local file="$1" local tag="$2" local extra=() if docker image inspect "${tag}" >/dev/null 2>&1; then extra+=(--cache-from "${tag}") fi bash "${ROOT}/scripts/retry-docker-build.sh" 5 60 -- \ docker buildx build \ --network=host \ --pull \ "${extra[@]}" \ --file "${file}" \ --tag "${tag}" \ --load \ --provenance=false \ --sbom=false \ "${ROOT}" } try_pull_bases() { docker pull "${BUILDER}" >/dev/null 2>&1 && docker pull "${RUNTIME}" >/dev/null 2>&1 } need_build=1 if (( FORCE == 0 )) && try_pull_bases; then echo "Using erlang base images from registry:" echo " ${BUILDER}" echo " ${RUNTIME}" need_build=0 fi if (( need_build )); then echo "Building erlang base images locally..." check_alpine_sync build_one "${ROOT}/docker/erlang/Dockerfile.builder" "${BUILDER}" build_one "${ROOT}/docker/erlang/Dockerfile.runtime" "${RUNTIME}" echo "=== erlang base images built ===" echo " ${BUILDER}" echo " ${RUNTIME}" fi if (( PUSH )); then bash "${ROOT}/scripts/retry-docker-build.sh" 5 30 -- docker push "${BUILDER}" bash "${ROOT}/scripts/retry-docker-build.sh" 5 30 -- docker push "${RUNTIME}" echo "Pushed ${BUILDER} and ${RUNTIME}" fi