Files
jukebox_maker/ops/build-image.sh
Michael Chus f2a7505378 ops: merge build and push into single build-image.sh
Если указан image — собирает мультиарч и пушит.
Если image пустой — локальная сборка без пуша.
push-image.sh удалён.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:48:52 +03:00

92 lines
2.5 KiB
Bash
Executable File

#!/bin/sh
# Build a Docker image. If an image name is provided, builds multi-arch and pushes to registry.
# Otherwise builds locally for the current platform only.
#
# Usage (interactive):
# ./ops/build-image.sh
#
# Usage (non-interactive):
# ./ops/build-image.sh <tag> [image]
#
# Examples:
# ./ops/build-image.sh # prompts for tag and image
# ./ops/build-image.sh v1.0 # prompts for image
# ./ops/build-image.sh v1.0 registry.example.com/org/myapp # local only (no push)
# ./ops/build-image.sh v1.0 "" # local build, no push
set -eu
ROOT_DIR=$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)
die() { echo "error: $*" >&2; exit 1; }
command -v docker >/dev/null 2>&1 || die "docker not found in PATH"
DEFAULT_TAG=$(git -C "${ROOT_DIR}" rev-parse --short HEAD 2>/dev/null || echo dev)
ask() {
# $1=varname $2=prompt $3=default
if [ -n "$3" ]; then
printf "%s [%s]: " "$2" "$3" >&2
else
printf "%s (leave empty to build locally only): " "$2" >&2
fi
read -r _val
eval "$1=\"\${_val:-$3}\""
}
if [ $# -ge 2 ]; then
IMAGE_TAG="$1"
IMAGE="$2"
elif [ $# -ge 1 ]; then
IMAGE_TAG="$1"
ask IMAGE "Image" ""
else
ask IMAGE_TAG "Tag" "${DEFAULT_TAG}"
ask IMAGE "Image" ""
fi
if [ -n "${IMAGE}" ]; then
# multi-arch build + push
docker buildx version >/dev/null 2>&1 || die "docker buildx not available"
PLATFORMS="${PLATFORMS:-linux/amd64,linux/arm64}"
BUILDER_NAME="jukebox-multiarch"
if ! docker buildx inspect "${BUILDER_NAME}" >/dev/null 2>&1; then
echo "creating buildx builder: ${BUILDER_NAME}"
docker buildx create \
--name "${BUILDER_NAME}" \
--driver docker-container \
--bootstrap
fi
docker buildx use "${BUILDER_NAME}"
echo "building and pushing ${IMAGE}:${IMAGE_TAG} (${PLATFORMS})"
docker buildx build \
--platform "${PLATFORMS}" \
--file "${ROOT_DIR}/Dockerfile" \
-t "${IMAGE}:${IMAGE_TAG}" \
-t "${IMAGE}:latest" \
--push \
"${ROOT_DIR}"
echo ""
echo "pushed:"
echo " ${IMAGE}:${IMAGE_TAG}"
echo " ${IMAGE}:latest"
else
# local build only
echo "building locally (no push)"
docker build \
--file "${ROOT_DIR}/Dockerfile" \
-t "jukebox-maker:${IMAGE_TAG}" \
-t "jukebox-maker:latest" \
"${ROOT_DIR}"
echo ""
echo "built:"
echo " jukebox-maker:${IMAGE_TAG}"
echo " jukebox-maker:latest"
fi