154 lines
5.6 KiB
Bash
Executable file
154 lines
5.6 KiB
Bash
Executable file
#!/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"
|