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_VERSION ?= latest
DOCKER_IMAGES := ansible-controller alt-linux astra-linux redos rhel centos alma rocky 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 .PHONY: role vault git docker presets controller help
# ============================================================================= # =============================================================================
@@ -366,10 +373,14 @@ docker:
echo " make docker build - сборка образов"; \ echo " make docker build - сборка образов"; \
echo " make docker push - отправка в Docker Hub";; \ echo " make docker push - отправка в Docker Hub";; \
build) \ 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 \ for image in $(DOCKER_IMAGES); do \
echo "🔨 Сборка $(DOCKER_REGISTRY)/$$image:$(DOCKER_VERSION)"; \ echo "🔨 Сборка $(DOCKER_REGISTRY)/$$image:$(DOCKER_VERSION)"; \
(cd dockerfiles/$$image && docker build -t $(DOCKER_REGISTRY)/$$image:$(DOCKER_VERSION) .); \ $(MAKE) docker-build-image IMAGE=$$image; \
done; \ done; \
echo "✅ Образы собраны";; \ echo "✅ Образы собраны";; \
push) \ push) \
@@ -436,10 +447,12 @@ docker:
echo " 💡 Показывает: registry, version, список образов"; \ echo " 💡 Показывает: registry, version, список образов"; \
echo " 💡 Рекомендует: docker login перед работой"; \ echo " 💡 Рекомендует: docker login перед работой"; \
echo ""; \ echo ""; \
echo " 🐳 make docker build - собрать все Docker образы"; \ echo " 🐳 make docker build - собрать все Docker образы (multi-arch)"; \
echo " 💡 Собирает: ansible-controller, alt-linux, astra-linux, redos"; \ echo " 💡 Собирает: ansible-controller, alt-linux, astra-linux, redos"; \
echo " 💡 Собирает: rhel, centos, alma, rocky"; \ echo " 💡 Собирает: rhel, centos, alma, rocky"; \
echo " 💡 Тегирует: inecs/образ:latest"; \ echo " 💡 Платформы: $(DOCKER_PLATFORMS)"; \
echo " 💡 Тегирует: inecs/образ:<tag> (автоматически извлекает теги)"; \
echo " 💡 Отправляет: автоматически в Docker Hub"; \
echo ""; \ echo ""; \
echo " 📤 make docker push - отправить образы в Docker Hub"; \ echo " 📤 make docker push - отправить образы в Docker Hub"; \
echo " 💡 Требует: docker login"; \ echo " 💡 Требует: docker login"; \
@@ -466,15 +479,93 @@ docker:
echo " ⚠️ ТРЕБУЕТ: подтверждение пользователя";; \ echo " ⚠️ ТРЕБУЕТ: подтверждение пользователя";; \
esac 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 # КОМАНДЫ ДЛЯ РАБОТЫ С ANSIBLE-CONTROLLER
# ============================================================================= # =============================================================================
controller: controller:
@case "$(word 2, $(MAKECMDGOALS))" in \ @case "$(word 2, $(MAKECMDGOALS))" in \
build) \ build) \
echo "🔨 Сборка ansible-controller..."; \ echo "🔨 Сборка ansible-controller (multi-arch)..."; \
cd dockerfiles/ansible-controller && docker build -t $(DOCKER_REGISTRY)/ansible-controller:$(DOCKER_VERSION) .; \ echo "📋 Платформы: $(DOCKER_PLATFORMS)"; \
echo "✅ ansible-controller собран";; \ $(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) \ run) \
echo "🚀 Запуск ansible-controller..."; \ echo "🚀 Запуск ansible-controller..."; \
cd dockerfiles/ansible-controller && docker-compose up -d; \ cd dockerfiles/ansible-controller && docker-compose up -d; \
@@ -486,9 +577,11 @@ controller:
*) \ *) \
echo "🎯 Доступные команды:"; \ echo "🎯 Доступные команды:"; \
echo ""; \ echo ""; \
echo " 🔨 make controller build - собрать ansible-controller"; \ echo " 🔨 make controller build - собрать ansible-controller (multi-arch)"; \
echo " 💡 Собирает: inecs/ansible-controller:latest"; \ echo " 💡 Собирает: inecs/ansible-controller:latest"; \
echo " 💡 Платформы: $(DOCKER_PLATFORMS)"; \
echo " 💡 Использует: dockerfiles/ansible-controller/Dockerfile"; \ echo " 💡 Использует: dockerfiles/ansible-controller/Dockerfile"; \
echo " 💡 Requirements: dockerfiles/ansible-controller/requirements.yml"; \
echo ""; \ echo ""; \
echo " 🚀 make controller run - запустить ansible-controller"; \ echo " 🚀 make controller run - запустить ansible-controller"; \
echo " 💡 Запускает: docker-compose up -d"; \ echo " 💡 Запускает: docker-compose up -d"; \

View File

@@ -57,7 +57,7 @@ RUN curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.22.1 sh - \
&& rm -rf istio-1.22.1 && rm -rf istio-1.22.1
# Копируем requirements.yml # Копируем requirements.yml
COPY requirements.yml /tmp/requirements.yml COPY dockerfiles/ansible-controller/requirements.yml /tmp/requirements.yml
# Устанавливаем Ansible коллекции # Устанавливаем Ansible коллекции
RUN ansible-galaxy collection install -r /tmp/requirements.yml RUN ansible-galaxy collection install -r /tmp/requirements.yml