From e389cad39328b154926cc744ac713e49ff3d5721 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 15:13:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5?= =?UTF-8?q?=D0=BC=20=D1=81=20Docker=20Buildx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Заменен buildx ls на безопасный buildx inspect - Добавлены диагностические команды для buildx - Создана функция docker-diagnose-buildx для отладки - Добавлена функция docker-reset-builder для сброса - Предварительная загрузка образа moby/buildkit:buildx-stable-1 - Полная очистка buildkit контейнеров - Обновлена документация и справка - Добавлен тестовый скрипт для проверки исправлений Автор: Сергей Антропов Сайт: https://devops.org.ru --- Makefile | 135 ++++++++++++++++++++++++++++++----- docs/buildx-fixes.md | 98 +++++++++++++++++++++++++ scripts/test-buildx-fixes.sh | 115 +++++++++++++++++++++++++++++ 3 files changed, 330 insertions(+), 18 deletions(-) create mode 100644 docs/buildx-fixes.md create mode 100755 scripts/test-buildx-fixes.sh diff --git a/Makefile b/Makefile index e1a1811..2fd154c 100644 --- a/Makefile +++ b/Makefile @@ -462,26 +462,24 @@ docker: fi;; \ clean-builder) \ echo "🧹 Очистка multi-arch builder..."; \ - if docker buildx ls | grep -q $(DOCKER_BUILDX_BUILDER); then \ - echo "🗑️ Удаление builder $(DOCKER_BUILDX_BUILDER)..."; \ - docker buildx rm $(DOCKER_BUILDX_BUILDER) || true; \ - echo "✅ Builder удален"; \ - else \ - echo "ℹ️ Builder $(DOCKER_BUILDX_BUILDER) не найден"; \ - fi;; \ + $(MAKE) docker-reset-builder;; \ 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 --bootstrap --use; \ - echo "⏳ Ожидание запуска builder..."; \ - sleep 5; \ - else \ - echo "✅ Builder $(DOCKER_BUILDX_BUILDER) уже существует"; \ + if $(MAKE) docker-check-builder >/dev/null 2>&1; then \ + echo "✅ Builder $(DOCKER_BUILDX_BUILDER) уже существует и готов"; \ docker buildx use $(DOCKER_BUILDX_BUILDER); \ + else \ + echo "📦 Создание builder $(DOCKER_BUILDX_BUILDER)..."; \ + $(MAKE) docker-create-builder; \ fi; \ - echo "🔍 Проверка статуса builder..."; \ - docker buildx inspect $(DOCKER_BUILDX_BUILDER) --bootstrap;; \ + echo "🔍 Финальная проверка builder..."; \ + $(MAKE) docker-check-builder;; \ + diagnose) \ + echo "🔍 Диагностика buildx проблем..."; \ + $(MAKE) docker-diagnose-buildx;; \ + reset-builder) \ + echo "🔄 Сброс buildx builder..."; \ + $(MAKE) docker-reset-builder;; \ *) \ echo "🎯 Доступные команды:"; \ echo ""; \ @@ -515,12 +513,21 @@ docker: echo " 💡 Безопасно: игнорирует ошибки"; \ echo ""; \ echo " 🧹 make docker clean-builder - очистка multi-arch builder"; \ - echo " 💡 Удаляет: builder контейнер"; \ + echo " 💡 Удаляет: builder контейнер и buildkit контейнеры"; \ echo " 💡 Полезно: при проблемах со сборкой"; \ echo ""; \ echo " 🔧 make docker setup-builder - настройка multi-arch builder"; \ echo " 💡 Создает: builder в контейнере (не в системе)"; \ echo " 💡 Поддерживает: amd64 и arm64 архитектуры"; \ + echo " 💡 Безопасно: использует inspect вместо buildx ls"; \ + echo ""; \ + echo " 🔍 make docker diagnose - диагностика buildx проблем"; \ + echo " 💡 Проверяет: версии, контексты, builder, registry"; \ + echo " 💡 Показывает: рекомендации по устранению проблем"; \ + echo ""; \ + echo " 🔄 make docker reset-builder - сброс buildx builder"; \ + echo " 💡 Удаляет: старый builder и buildkit контейнеры"; \ + echo " 💡 Создает: новый builder с предварительной загрузкой образа"; \ echo ""; \ echo " 📊 make docker info - информация о собранных образах"; \ echo " 💡 Показывает: размер, дата создания, теги"; \ @@ -540,6 +547,93 @@ docker: # ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ДЛЯ DOCKER # ============================================================================= +# Надежная проверка существования buildx builder без использования buildx ls +# Использует docker buildx inspect вместо buildx ls для избежания зависаний +.PHONY: docker-check-builder +docker-check-builder: + @echo "🔍 Проверка buildx builder $(DOCKER_BUILDX_BUILDER)..." + @if docker buildx inspect $(DOCKER_BUILDX_BUILDER) >/dev/null 2>&1; then \ + echo "✅ Builder $(DOCKER_BUILDX_BUILDER) существует и готов"; \ + exit 0; \ + else \ + echo "❌ Builder $(DOCKER_BUILDX_BUILDER) не найден"; \ + exit 1; \ + fi + +# Безопасное создание buildx builder с предварительной очисткой +.PHONY: docker-create-builder +docker-create-builder: + @echo "🔧 Создание buildx builder $(DOCKER_BUILDX_BUILDER)..." + @echo "📦 Предварительная загрузка образа buildkit..." + @docker pull moby/buildkit:buildx-stable-1 || echo "⚠️ Не удалось загрузить moby/buildkit:buildx-stable-1, будет использован авто-пулл" + @echo "🗑️ Удаление существующего builder (если есть)..." + @docker buildx rm -f $(DOCKER_BUILDX_BUILDER) 2>/dev/null || true + @echo "📦 Создание нового builder..." + @docker buildx create \ + --name $(DOCKER_BUILDX_BUILDER) \ + --driver docker-container \ + --driver-opt image=moby/buildkit:buildx-stable-1 \ + --use || exit 1 + @echo "⏳ Ожидание запуска buildkit контейнера..." + @sleep 3 + @echo "🔍 Проверка готовности builder..." + @docker buildx inspect --builder $(DOCKER_BUILDX_BUILDER) --bootstrap >/dev/null || exit 1 + @echo "✅ Builder $(DOCKER_BUILDX_BUILDER) создан и готов к работе" + +# Диагностика проблем с buildx +.PHONY: docker-diagnose-buildx +docker-diagnose-buildx: + @echo "🔍 ДИАГНОСТИКА BUILDX ПРОБЛЕМ" + @echo "==========================================" + @echo "" + @echo "📊 1. Версии Docker и Buildx:" + @docker version --format "Docker: {{.Server.Version}}" 2>/dev/null || echo "❌ Docker недоступен" + @docker buildx version 2>/dev/null || echo "❌ Buildx недоступен" + @echo "" + @echo "📋 2. Docker контексты (поиск мертвых tcp://):" + @docker context ls 2>/dev/null || echo "❌ Не удалось получить список контекстов" + @echo "" + @echo "🔍 3. Проверка builder $(DOCKER_BUILDX_BUILDER):" + @if docker buildx inspect $(DOCKER_BUILDX_BUILDER) >/dev/null 2>&1; then \ + echo "✅ Builder $(DOCKER_BUILDX_BUILDER) существует"; \ + docker buildx inspect $(DOCKER_BUILDX_BUILDER) --bootstrap >/dev/null 2>&1 && echo "✅ Builder готов" || echo "❌ Builder не готов"; \ + else \ + echo "❌ Builder $(DOCKER_BUILDX_BUILDER) не найден"; \ + fi + @echo "" + @echo "🐳 4. Buildkit контейнеры:" + @docker ps -a --filter "name=buildx_buildkit" --format "table {{.Names}}\t{{.Status}}\t{{.CreatedAt}}" 2>/dev/null || echo "❌ Не удалось получить список контейнеров" + @echo "" + @echo "🌐 5. Проверка доступа к registry:" + @echo "📥 Тест загрузки moby/buildkit:buildx-stable-1..." + @timeout 30 docker pull moby/buildkit:buildx-stable-1 >/dev/null 2>&1 && echo "✅ Доступ к registry OK" || echo "❌ Проблемы с доступом к registry" + @echo "" + @echo "🔧 6. Docker socket доступ:" + @if [ -S /var/run/docker.sock ]; then \ + echo "✅ Docker socket доступен: /var/run/docker.sock"; \ + ls -la /var/run/docker.sock; \ + else \ + echo "❌ Docker socket недоступен: /var/run/docker.sock"; \ + fi + @echo "" + @echo "💡 РЕКОМЕНДАЦИИ:" + @echo " - Если buildx ls зависает: удалите мертвые контексты (docker context rm )" + @echo " - Если pull зависает: настройте прокси или используйте mirror registry" + @echo " - Если builder не создается: проверьте права доступа к Docker socket" + @echo " - Для полной очистки: make docker clean-builder && make docker-create-builder" + +# Быстрая очистка и пересоздание builder +.PHONY: docker-reset-builder +docker-reset-builder: + @echo "🔄 Сброс buildx builder..." + @echo "🗑️ Удаление builder $(DOCKER_BUILDX_BUILDER)..." + @docker buildx rm -f $(DOCKER_BUILDX_BUILDER) 2>/dev/null || true + @echo "🧹 Очистка buildkit контейнеров..." + @docker ps -a --filter "name=buildx_buildkit" --format "{{.Names}}" | xargs -r docker rm -f 2>/dev/null || true + @echo "📦 Создание нового builder..." + @$(MAKE) docker-create-builder + @echo "✅ Builder сброшен и готов к работе" + # Извлечение тега из базового образа docker-get-base-tag: @@ -687,7 +781,10 @@ help: @echo "🔧 DOCKER BUILDER (Multi-Arch):" @echo " make docker setup-builder - настройка multi-arch builder в контейнере" @echo " make docker clean-builder - очистка multi-arch builder" + @echo " make docker diagnose - диагностика buildx проблем" + @echo " make docker reset-builder - сброс buildx builder" @echo " 💡 Поддерживает: amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6" + @echo " 💡 Безопасно: использует inspect вместо buildx ls (избегает зависаний)" @echo "" @echo "🔐 VAULT (управление секретами):" @echo " make vault create - создать новый файл секретов" @@ -715,6 +812,8 @@ help: @echo " make presets test PRESET=etcd-patroni # тест с etcd-patroni" @echo " make role test minimal # быстрый тест" @echo " make docker setup-builder # настройка multi-arch builder" + @echo " make docker diagnose # диагностика buildx проблем" + @echo " make docker reset-builder # сброс buildx builder" @echo " make docker build # собрать все образы (amd64 + arm64)" @echo " make docker rebuild # полная пересборка с очисткой кеша" @echo " make controller build # собрать ansible-controller (multi-arch)" @@ -726,5 +825,5 @@ help: @echo "==========================================" # Пустые цели для совместимости -view create edit show delete lint deploy new advanced list info test build push pull clean prepare update run stop purge clean-builder setup-builder: +view create edit show delete lint deploy new advanced list info test build push pull clean prepare update run stop purge clean-builder setup-builder diagnose reset-builder: @true diff --git a/docs/buildx-fixes.md b/docs/buildx-fixes.md new file mode 100644 index 0000000..3e8c48c --- /dev/null +++ b/docs/buildx-fixes.md @@ -0,0 +1,98 @@ +# Исправления проблем с Docker Buildx + +## Проблема +Команда `docker buildx ls` часто зависает в CI/CD окружениях из-за: +- Мертвых Docker контекстов (tcp://...) +- Проблем с доступом к registry +- Недостаточных привилегий +- Старых/битых builder'ов + +## Решение + +### 1. Замена `buildx ls` на `buildx inspect` +**Было:** +```bash +if ! docker buildx ls | grep -q $(DOCKER_BUILDX_BUILDER); then +``` + +**Стало:** +```bash +if docker buildx inspect $(DOCKER_BUILDX_BUILDER) >/dev/null 2>&1; then +``` + +### 2. Новые надежные функции + +#### `docker-check-builder` +- Проверяет существование builder'а через `inspect` +- Не зависает на мертвых контекстах +- Возвращает четкий статус + +#### `docker-create-builder` +- Предварительная загрузка образа `moby/buildkit:buildx-stable-1` +- Очистка старых builder'ов +- Явное указание образа buildkit +- Проверка готовности через `inspect --bootstrap` + +#### `docker-diagnose-buildx` +- Полная диагностика проблем с buildx +- Проверка версий Docker и Buildx +- Поиск мертвых контекстов +- Проверка доступа к registry +- Проверка Docker socket +- Рекомендации по устранению + +#### `docker-reset-builder` +- Полная очистка и пересоздание builder'а +- Удаление buildkit контейнеров +- Создание нового builder'а с предварительной загрузкой + +### 3. Обновленные команды + +#### `make docker setup-builder` +- Использует `docker-check-builder` вместо `buildx ls` +- Безопасное создание builder'а +- Предварительная загрузка образа + +#### `make docker clean-builder` +- Теперь использует `docker-reset-builder` +- Полная очистка buildkit контейнеров + +#### Новые команды: +- `make docker diagnose` - диагностика проблем +- `make docker reset-builder` - сброс builder'а + +### 4. Преимущества + +✅ **Нет зависаний** - не использует `buildx ls` +✅ **Быстрая диагностика** - четкие сообщения об ошибках +✅ **Предварительная загрузка** - избегает проблем с pull в bootstrap +✅ **Полная очистка** - удаляет все связанные контейнеры +✅ **Подробные логи** - понятные сообщения о процессе + +### 5. Использование + +```bash +# Диагностика проблем +make docker diagnose + +# Сброс builder'а при проблемах +make docker reset-builder + +# Обычная настройка (теперь безопасная) +make docker setup-builder + +# Сборка образов +make docker build +``` + +### 6. Рекомендации для CI/CD + +1. **Используйте `docker-diagnose-buildx`** при проблемах +2. **Настройте прокси** для доступа к registry +3. **Очищайте мертвые контексты** регулярно +4. **Используйте `docker-reset-builder`** при зависаниях +5. **Проверяйте права доступа** к Docker socket + +## Автор +Сергей Антропов +Сайт: https://devops.org.ru diff --git a/scripts/test-buildx-fixes.sh b/scripts/test-buildx-fixes.sh new file mode 100755 index 0000000..c9829f7 --- /dev/null +++ b/scripts/test-buildx-fixes.sh @@ -0,0 +1,115 @@ +#!/bin/bash +# Тестирование исправлений buildx проблем +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +set -euo pipefail + +echo "🧪 ТЕСТИРОВАНИЕ ИСПРАВЛЕНИЙ BUILDX" +echo "==================================" +echo "" + +# Цвета для вывода +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +BLUE='\033[0;34m' +RESET='\033[0m' + +# Функция для вывода результатов +test_result() { + local test_name="$1" + local result="$2" + local message="$3" + + if [ "$result" = "PASS" ]; then + echo -e "${GREEN}✅ $test_name: $message${RESET}" + else + echo -e "${RED}❌ $test_name: $message${RESET}" + fi +} + +echo "🔍 1. Проверка версий Docker и Buildx..." +if docker version >/dev/null 2>&1; then + test_result "Docker" "PASS" "Docker доступен" +else + test_result "Docker" "FAIL" "Docker недоступен" + exit 1 +fi + +if docker buildx version >/dev/null 2>&1; then + test_result "Buildx" "PASS" "Buildx доступен" +else + test_result "Buildx" "FAIL" "Buildx недоступен" + exit 1 +fi + +echo "" +echo "🔍 2. Тестирование docker-check-builder..." +if make docker-check-builder >/dev/null 2>&1; then + test_result "check-builder" "PASS" "Builder существует" +else + test_result "check-builder" "PASS" "Builder не найден (ожидаемо)" +fi + +echo "" +echo "🔍 3. Тестирование docker-diagnose-buildx..." +if make docker-diagnose-buildx >/dev/null 2>&1; then + test_result "diagnose" "PASS" "Диагностика работает" +else + test_result "diagnose" "FAIL" "Диагностика не работает" +fi + +echo "" +echo "🔍 4. Тестирование docker-create-builder..." +echo "📦 Создание тестового builder..." +if make docker-create-builder >/dev/null 2>&1; then + test_result "create-builder" "PASS" "Builder создан успешно" +else + test_result "create-builder" "FAIL" "Не удалось создать builder" +fi + +echo "" +echo "🔍 5. Проверка созданного builder..." +if make docker-check-builder >/dev/null 2>&1; then + test_result "verify-builder" "PASS" "Builder готов к работе" +else + test_result "verify-builder" "FAIL" "Builder не готов" +fi + +echo "" +echo "🔍 6. Тестирование docker-reset-builder..." +if make docker-reset-builder >/dev/null 2>&1; then + test_result "reset-builder" "PASS" "Builder сброшен успешно" +else + test_result "reset-builder" "FAIL" "Не удалось сбросить builder" +fi + +echo "" +echo "🔍 7. Проверка отсутствия buildx ls в коде..." +if grep -r "buildx ls" Makefile >/dev/null 2>&1; then + test_result "no-buildx-ls" "FAIL" "Найдены использования buildx ls" +else + test_result "no-buildx-ls" "PASS" "buildx ls не используется" +fi + +echo "" +echo "🔍 8. Проверка использования inspect..." +if grep -r "buildx inspect" Makefile >/dev/null 2>&1; then + test_result "uses-inspect" "PASS" "Используется buildx inspect" +else + test_result "uses-inspect" "FAIL" "buildx inspect не используется" +fi + +echo "" +echo "==================================" +echo "🎯 РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ" +echo "==================================" +echo "" +echo "💡 Рекомендации:" +echo " - Используйте 'make docker diagnose' при проблемах" +echo " - Используйте 'make docker reset-builder' при зависаниях" +echo " - Избегайте 'docker buildx ls' в CI/CD" +echo " - Используйте 'make docker setup-builder' для настройки" +echo "" +echo "✅ Исправления buildx проблем готовы к использованию!"