#!/bin/sh usage() { echo "✏️ Использование: $0 -n <имя> -v <версия> -d <версия_docker> -b <версия_базового_образа> [-r <адрес_registry>] [-p <порт>]" echo "🔧 Опции:" echo " -n, --name Имя образа (обязательно)" echo " -v, --version Версия образа в формате X.Y.Z (обязательно)" echo " -d, --docker-version Версия Docker для сборки (обязательно)" echo " -b, --base-image-version Версия базового образа (обязательно)" echo " -r, --push-to-registry Адрес registry для отправки образов (например, registry.example.com)" echo " -p, --port Порт registry (по умолчанию 5000)" echo "" echo "📌 Примеры:" echo " Только сборка: $0 -n myapp -v 2.5.7 -d 20.10 -b 3.8" echo " Сборка и отправка: $0 -n myapp -v 2.5.7 -d 20.10 -b 3.8 -r registry.example.com" echo " Сборка и отправка с другим портом: $0 -n myapp -v 2.5.7 -d 20.10 -b 3.8 -r registry.example.com -p 8080" exit 1 } validate_version() { echo "$1" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$' || { echo "❌ Ошибка: Версия должна быть в формате X.Y.Z (например, 2.5.7)" exit 1 } } validate_address() { if [ -z "$1" ]; then echo "❌ Ошибка: Адрес registry не может быть пустым" exit 1 } } validate_port() { if [ -n "$1" ]; then echo "$1" | grep -Eq '^[0-9]+$' || { echo "❌ Ошибка: Порт должен быть числом" exit 1 } fi } check_dockerfile() { if [ ! -f "Dockerfile.$1" ]; then echo "❌ Ошибка: Файл Dockerfile.$1 не найден в директории docker" exit 1 fi } push_to_registry=false name="" version="" docker_version="" base_image_version="" registry_address="" port="5000" while getopts ":n:v:d:b:p:r:" opt; do case $opt in n) name="$OPTARG" ;; v) version="$OPTARG" ;; d) docker_version="$OPTARG" ;; b) base_image_version="$OPTARG" ;; p) port="$OPTARG" ;; r) push_to_registry=true; registry_address="$OPTARG" ;; \?) echo "❌ Неверный аргумент -$OPTARG" >&2; usage ;; :) echo "❌ Опция -$OPTARG требует аргумент" >&2; usage ;; esac done if [ -z "$name" ] || [ -z "$version" ] || [ -z "$docker_version" ] || [ -z "$base_image_version" ]; then echo "❌ Ошибка: Не указаны обязательные аргументы (-n, -v, -d и -b)" usage fi validate_version "$version" if [ "$push_to_registry" = true ]; then if [ -z "$registry_address" ]; then echo "❌ Ошибка: Для отправки в registry необходимо указать адрес с -r" usage fi validate_address "$registry_address" validate_port "$port" fi echo "📂 Переход в директорию docker..." cd docker || { echo "❌ Ошибка: Не удалось перейти в директорию docker" exit 1 } echo "🔍 Проверка наличия Dockerfile..." check_dockerfile "$docker_version" echo "🐳 Сборка образа $name:$version с использованием Dockerfile.$docker_version и базового образа версии $base_image_version..." docker build . -f "Dockerfile.$docker_version" -t "${name}:${version}" --build-arg BASE_IMAGE_VERSION="$base_image_version" || { echo "❌ Ошибка при сборке образа" exit 1 } if [ "$push_to_registry" = true ]; then registry="$registry_address:$port" 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"