#!/bin/sh usage() { local exit_code="$1" echo "✏️ Использование: $0 -n <имя> -v <версия> -b <версия_базового_образа> [-o] [-R <репозитории>] [-r <адрес_registry>] [-p <порт>] [-h]" echo "🔧 Опции:" echo " -n, --name Имя собираемого образа (обязательно)" echo " -v, --version Версия собираемого образа в формате X.Y.Z (обязательно)" echo " -b, --base-image-version Версия базового образа Alpine Linux (обязательно)" echo " -o, --old Использовать метод сборки для устаревшей версии Docker" echo " -R, --repositories Список репозиториев для сборки (через точку с запятой)" echo " -r, --push-to-registry Адрес registry для отправки образов" echo " -p, --port Порт registry" echo " -h, --help Показать эту справку" exit "$exit_code" } validate_version() { echo "$1" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$' || { echo "❌ Ошибка: Версия должна быть в формате X.Y.Z (например, 2.5.7)" usage 1 } } validate_address() { if [ -z "$1" ]; then echo "❌ Ошибка: Адрес registry не может быть пустым" usage 1 fi } validate_port() { if [ -n "$1" ]; then echo "$1" | grep -Eq '^[0-9]+$' || { echo "❌ Ошибка: Порт должен быть числом" usage 1 } fi } check_dockerfile() { if [ ! -f "$1" ]; then echo "❌ Ошибка: Файл $1 не найден в директории docker" usage 1 fi } push_to_registry=false name="" version="" base_image_version="" registry_address="" port="" use_old=false dockerfile="Dockerfile.27.3.1" repositories="" if ! command -v getopt >/dev/null 2>&1; then echo "❌ Ошибка: утилита getopt не найдена" usage 1 fi opts=$(getopt -o n:v:b:oR:r:p:h -l name:,version:,base-image-version:,old,repositories:,push-to-registry:,port:,help -n "$0" -- "$@") if [ $? -ne 0 ]; then echo "❌ Ошибка парсинга аргументов" usage 1 fi eval set -- "$opts" while true; do case "$1" in -n|--name) name="$2"; shift 2 ;; -v|--version) version="$2"; shift 2 ;; -b|--base-image-version) base_image_version="$2"; shift 2 ;; -r|--push-to-registry) push_to_registry=true; registry_address="$2"; shift 2 ;; -p|--port) port="$2"; shift 2 ;; -o|--old) use_old=true; shift ;; -R|--repositories) repositories="$2"; shift 2 ;; -h|--help) usage 0 ;; --) shift; break ;; *) echo "❌ Неверный аргумент $1" >&2; usage 1 ;; esac done if [ -z "$name" ] || [ -z "$version" ] || [ -z "$base_image_version" ]; then echo "❌ Ошибка: Не указаны обязательные аргументы (-n, -v и -b)" usage 1 fi validate_version "$version" if [ "$push_to_registry" = true ]; then if [ -z "$registry_address" ]; then echo "❌ Ошибка: Для отправки в registry необходимо указать адрес с -r" usage 1 fi validate_address "$registry_address" validate_port "$port" fi echo "📂 Переход в директорию docker..." cd docker || { echo "❌ Ошибка: Не удалось перейти в директорию docker" exit 1 } if [ "$use_old" = true ]; then dockerfile="Dockerfile.20.10.20" fi echo "🔍 Проверка наличия Dockerfile..." check_dockerfile "$dockerfile" echo "🐳 Сборка образа $name:$version с использованием $dockerfile и базового образа версии $base_image_version..." if [ -n "$repositories" ]; then echo "📦 Используемые репозитории:" echo "$repositories" | tr ';' '\n' | while read -r repo; do echo -e " 🌐 $repo" done docker build . -f "$dockerfile" -t "${name}:${version}" --build-arg BASE_IMAGE_VERSION="$base_image_version" --build-arg REPOSITORIES="$repositories" || { echo "❌ Ошибка при сборке образа" exit 1 } else docker build . -f "$dockerfile" -t "${name}:${version}" --build-arg BASE_IMAGE_VERSION="$base_image_version" || { echo "❌ Ошибка при сборке образа" exit 1 } fi if [ "$push_to_registry" = true ]; then if [ -z "$port" ]; then registry="$registry_address" else registry="$registry_address:$port" fi echo "🏷 Создание тегов для registry..." docker tag "${name}:${version}" "${registry}/${name}:latest" || { echo "❌ Ошибка при создании тега latest" exit 1 } major=$(echo "$version" | cut -d. -f1) minor=$(echo "$version" | cut -d. -f1-2) full="$version" docker tag "${name}:${version}" "${registry}/${name}:$full" || { echo "❌ Ошибка при создании тега $full" exit 1 } docker tag "${name}:${version}" "${registry}/${name}:$minor" || { echo "❌ Ошибка при создании тега $minor" exit 1 } docker tag "${name}:${version}" "${registry}/${name}:$major" || { echo "❌ Ошибка при создании тега $major" exit 1 } echo " ✅ Созданы теги: latest, $full, $minor, $major" echo "🚀 Отправка образов в registry..." docker push "${registry}/${name}:latest" || { echo "❌ Ошибка при отправке тега latest" exit 1 } docker push "${registry}/${name}:$full" || { echo "❌ Ошибка при отправке тега $full" exit 1 } docker push "${registry}/${name}:$minor" || { echo "❌ Ошибка при отправке тега $minor" exit 1 } docker push "${registry}/${name}:$major" || { echo "❌ Ошибка при отправке тега $major" exit 1 } fi echo "🎉 Готово! Образ ${name}:${version} успешно:" echo " ✅ Собран" [ "$push_to_registry" = true ] && echo " ✅ Размечен" [ "$push_to_registry" = true ] && echo " ✅ Отправлен в registry"