From 91e7554d71ccb60a95671d03456780f25ab72cae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=90=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BF=D0=BE=D0=B2?= Date: Sat, 25 Oct 2025 13:49:12 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20multi-arch=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B5=20=D0=B8=D0=B7=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлена поддержка 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 - Улучшенная справка с подробным описанием функций --- Makefile | 109 ++++++++++++++++++++-- dockerfiles/ansible-controller/Dockerfile | 2 +- 2 files changed, 102 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index db6dfd5..53268d1 100644 --- a/Makefile +++ b/Makefile @@ -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/образ: (автоматически извлекает теги)"; \ + 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"; \ diff --git a/dockerfiles/ansible-controller/Dockerfile b/dockerfiles/ansible-controller/Dockerfile index cc35de7..8a4bbf3 100644 --- a/dockerfiles/ansible-controller/Dockerfile +++ b/dockerfiles/ansible-controller/Dockerfile @@ -57,7 +57,7 @@ RUN curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.22.1 sh - \ && rm -rf istio-1.22.1 # Копируем requirements.yml -COPY requirements.yml /tmp/requirements.yml +COPY dockerfiles/ansible-controller/requirements.yml /tmp/requirements.yml # Устанавливаем Ansible коллекции RUN ansible-galaxy collection install -r /tmp/requirements.yml