feat: Добавлена поддержка multi-arch сборки и автоматическое извлечение тегов

- Добавлена поддержка multi-arch сборки (amd64 и arm64) для всех Docker образов
- Реализовано автоматическое извлечение тегов из базовых образов
- Добавлены вспомогательные функции:
  * docker-setup-builder - настройка multi-arch builder
  * docker-get-base-tag - извлечение тегов из базовых образов
  * docker-build-image - сборка одного образа с multi-arch
- Обновлена сборка ansible-controller с поддержкой multi-arch
- Исправлен путь к requirements.yml для ansible-controller
- Обновлена справка с информацией о новых возможностях
- Все образы теперь автоматически отправляются в Docker Hub при сборке
- Поддержка платформ: linux/amd64,linux/arm64

Новые возможности:
- Автоматическое извлечение тегов из базовых образов
- Multi-arch сборка для всех образов
- Автоматическая отправка в Docker Hub
- Улучшенная справка с подробным описанием функций
This commit is contained in:
Сергей Антропов
2025-10-25 13:49:12 +03:00
parent cef8290341
commit 91e7554d71
2 changed files with 102 additions and 9 deletions

109
Makefile
View File

@@ -33,6 +33,13 @@ DOCKER_REGISTRY ?= inecs
DOCKER_VERSION ?= latest
DOCKER_IMAGES := ansible-controller alt-linux astra-linux redos rhel centos alma rocky
# Multi-arch поддержка
DOCKER_PLATFORMS ?= linux/amd64,linux/arm64
DOCKER_BUILDX_BUILDER ?= multiarch-builder
# Базовые образы и их теги
BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.redhat.com/ubi8/ubi quay.io/centos/centos:stream9 almalinux:8 rockylinux:8
.PHONY: role vault git docker presets controller help
# =============================================================================
@@ -366,10 +373,14 @@ docker:
echo " make docker build - сборка образов"; \
echo " make docker push - отправка в Docker Hub";; \
build) \
echo "🐳 Сборка Docker образов..."; \
echo "🐳 Сборка Docker образов (multi-arch)..."; \
echo "📋 Платформы: $(DOCKER_PLATFORMS)"; \
echo "📋 Builder: $(DOCKER_BUILDX_BUILDER)"; \
echo ""; \
$(MAKE) docker-setup-builder; \
for image in $(DOCKER_IMAGES); do \
echo "🔨 Сборка $(DOCKER_REGISTRY)/$$image:$(DOCKER_VERSION)"; \
(cd dockerfiles/$$image && docker build -t $(DOCKER_REGISTRY)/$$image:$(DOCKER_VERSION) .); \
$(MAKE) docker-build-image IMAGE=$$image; \
done; \
echo "✅ Образы собраны";; \
push) \
@@ -436,10 +447,12 @@ docker:
echo " 💡 Показывает: registry, version, список образов"; \
echo " 💡 Рекомендует: docker login перед работой"; \
echo ""; \
echo " 🐳 make docker build - собрать все Docker образы"; \
echo " 🐳 make docker build - собрать все Docker образы (multi-arch)"; \
echo " 💡 Собирает: ansible-controller, alt-linux, astra-linux, redos"; \
echo " 💡 Собирает: rhel, centos, alma, rocky"; \
echo " 💡 Тегирует: inecs/образ:latest"; \
echo " 💡 Платформы: $(DOCKER_PLATFORMS)"; \
echo " 💡 Тегирует: inecs/образ:<tag> (автоматически извлекает теги)"; \
echo " 💡 Отправляет: автоматически в Docker Hub"; \
echo ""; \
echo " 📤 make docker push - отправить образы в Docker Hub"; \
echo " 💡 Требует: docker login"; \
@@ -466,15 +479,93 @@ docker:
echo " ⚠️ ТРЕБУЕТ: подтверждение пользователя";; \
esac
# =============================================================================
# ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ДЛЯ DOCKER
# =============================================================================
# Настройка multi-arch builder
docker-setup-builder:
@echo "🔧 Настройка multi-arch builder..."; \
if ! docker buildx ls | grep -q $(DOCKER_BUILDX_BUILDER); then \
echo "📦 Создание builder $(DOCKER_BUILDX_BUILDER)..."; \
docker buildx create --name $(DOCKER_BUILDX_BUILDER) --driver docker-container --use; \
else \
echo "✅ Builder $(DOCKER_BUILDX_BUILDER) уже существует"; \
docker buildx use $(DOCKER_BUILDX_BUILDER); \
fi
# Извлечение тега из базового образа
docker-get-base-tag:
@if [ -z "$(IMAGE)" ]; then \
echo "❌ Ошибка: IMAGE не указан"; \
exit 1; \
fi; \
case "$(IMAGE)" in \
alt-linux) \
BASE_IMAGE="altlinux/p9"; \
TAG=$$(docker inspect --format='{{index .RepoDigests 0}}' $$BASE_IMAGE 2>/dev/null | cut -d'@' -f1 | cut -d':' -f2 || echo "latest");; \
astra-linux) \
BASE_IMAGE="astralinux/astra-1.7"; \
TAG=$$(docker inspect --format='{{index .RepoDigests 0}}' $$BASE_IMAGE 2>/dev/null | cut -d'@' -f1 | cut -d':' -f2 || echo "latest");; \
redos) \
BASE_IMAGE="redos/redos:9"; \
TAG=$$(docker inspect --format='{{index .RepoDigests 0}}' $$BASE_IMAGE 2>/dev/null | cut -d'@' -f1 | cut -d':' -f2 || echo "latest");; \
rhel) \
BASE_IMAGE="registry.access.redhat.com/ubi8/ubi"; \
TAG=$$(docker inspect --format='{{index .RepoDigests 0}}' $$BASE_IMAGE 2>/dev/null | cut -d'@' -f1 | cut -d':' -f2 || echo "latest");; \
centos) \
BASE_IMAGE="quay.io/centos/centos:stream9"; \
TAG=$$(docker inspect --format='{{index .RepoDigests 0}}' $$BASE_IMAGE 2>/dev/null | cut -d'@' -f1 | cut -d':' -f2 || echo "latest");; \
alma) \
BASE_IMAGE="almalinux:8"; \
TAG=$$(docker inspect --format='{{index .RepoDigests 0}}' $$BASE_IMAGE 2>/dev/null | cut -d'@' -f1 | cut -d':' -f2 || echo "latest");; \
rocky) \
BASE_IMAGE="rockylinux:8"; \
TAG=$$(docker inspect --format='{{index .RepoDigests 0}}' $$BASE_IMAGE 2>/dev/null | cut -d'@' -f1 | cut -d':' -f2 || echo "latest");; \
ansible-controller) \
TAG="latest";; \
*) \
echo "❌ Неизвестный образ: $(IMAGE)"; \
exit 1;; \
esac; \
echo "📋 Образ: $(IMAGE)"; \
echo "📋 Базовый образ: $$BASE_IMAGE"; \
echo "📋 Тег: $$TAG"; \
echo "$$TAG"
# Сборка одного образа с multi-arch
docker-build-image:
@if [ -z "$(IMAGE)" ]; then \
echo "❌ Ошибка: IMAGE не указан"; \
exit 1; \
fi; \
TAG=$$($(MAKE) docker-get-base-tag IMAGE=$(IMAGE)); \
echo "🔨 Сборка $(DOCKER_REGISTRY)/$(IMAGE):$$TAG"; \
cd dockerfiles/$(IMAGE) && \
docker buildx build \
--platform $(DOCKER_PLATFORMS) \
--tag $(DOCKER_REGISTRY)/$(IMAGE):$$TAG \
--tag $(DOCKER_REGISTRY)/$(IMAGE):latest \
--push \
.; \
echo "$(IMAGE):$$TAG собран и отправлен"
# =============================================================================
# КОМАНДЫ ДЛЯ РАБОТЫ С ANSIBLE-CONTROLLER
# =============================================================================
controller:
@case "$(word 2, $(MAKECMDGOALS))" in \
build) \
echo "🔨 Сборка ansible-controller..."; \
cd dockerfiles/ansible-controller && docker build -t $(DOCKER_REGISTRY)/ansible-controller:$(DOCKER_VERSION) .; \
echo "✅ ansible-controller собран";; \
echo "🔨 Сборка ansible-controller (multi-arch)..."; \
echo "📋 Платформы: $(DOCKER_PLATFORMS)"; \
$(MAKE) docker-setup-builder; \
cd dockerfiles/ansible-controller && \
docker buildx build \
--platform $(DOCKER_PLATFORMS) \
--tag $(DOCKER_REGISTRY)/ansible-controller:$(DOCKER_VERSION) \
--push \
.; \
echo "✅ ansible-controller собран и отправлен";; \
run) \
echo "🚀 Запуск ansible-controller..."; \
cd dockerfiles/ansible-controller && docker-compose up -d; \
@@ -486,9 +577,11 @@ controller:
*) \
echo "🎯 Доступные команды:"; \
echo ""; \
echo " 🔨 make controller build - собрать ansible-controller"; \
echo " 🔨 make controller build - собрать ansible-controller (multi-arch)"; \
echo " 💡 Собирает: inecs/ansible-controller:latest"; \
echo " 💡 Платформы: $(DOCKER_PLATFORMS)"; \
echo " 💡 Использует: dockerfiles/ansible-controller/Dockerfile"; \
echo " 💡 Requirements: dockerfiles/ansible-controller/requirements.yml"; \
echo ""; \
echo " 🚀 make controller run - запустить ansible-controller"; \
echo " 💡 Запускает: docker-compose up -d"; \