Исправления проблем с Docker Buildx

- Заменен buildx ls на безопасный buildx inspect
- Добавлены диагностические команды для buildx
- Создана функция docker-diagnose-buildx для отладки
- Добавлена функция docker-reset-builder для сброса
- Предварительная загрузка образа moby/buildkit:buildx-stable-1
- Полная очистка buildkit контейнеров
- Обновлена документация и справка
- Добавлен тестовый скрипт для проверки исправлений

Автор: Сергей Антропов
Сайт: https://devops.org.ru
This commit is contained in:
Сергей Антропов
2025-10-25 15:13:00 +03:00
parent 2652d8376f
commit e389cad393
3 changed files with 330 additions and 18 deletions

135
Makefile
View File

@@ -462,26 +462,24 @@ docker:
fi;; \ fi;; \
clean-builder) \ clean-builder) \
echo "🧹 Очистка multi-arch builder..."; \ echo "🧹 Очистка multi-arch builder..."; \
if docker buildx ls | grep -q $(DOCKER_BUILDX_BUILDER); then \ $(MAKE) docker-reset-builder;; \
echo "🗑️ Удаление builder $(DOCKER_BUILDX_BUILDER)..."; \
docker buildx rm $(DOCKER_BUILDX_BUILDER) || true; \
echo "✅ Builder удален"; \
else \
echo " Builder $(DOCKER_BUILDX_BUILDER) не найден"; \
fi;; \
setup-builder) \ setup-builder) \
echo "🔧 Настройка multi-arch builder в контейнере..."; \ echo "🔧 Настройка multi-arch builder в контейнере..."; \
if ! docker buildx ls | grep -q $(DOCKER_BUILDX_BUILDER); then \ if $(MAKE) docker-check-builder >/dev/null 2>&1; then \
echo "📦 Создание builder $(DOCKER_BUILDX_BUILDER) в контейнере..."; \ 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) уже существует"; \
docker buildx use $(DOCKER_BUILDX_BUILDER); \ docker buildx use $(DOCKER_BUILDX_BUILDER); \
else \
echo "📦 Создание builder $(DOCKER_BUILDX_BUILDER)..."; \
$(MAKE) docker-create-builder; \
fi; \ fi; \
echo "🔍 Проверка статуса builder..."; \ echo "🔍 Финальная проверка builder..."; \
docker buildx inspect $(DOCKER_BUILDX_BUILDER) --bootstrap;; \ $(MAKE) docker-check-builder;; \
diagnose) \
echo "🔍 Диагностика buildx проблем..."; \
$(MAKE) docker-diagnose-buildx;; \
reset-builder) \
echo "🔄 Сброс buildx builder..."; \
$(MAKE) docker-reset-builder;; \
*) \ *) \
echo "🎯 Доступные команды:"; \ echo "🎯 Доступные команды:"; \
echo ""; \ echo ""; \
@@ -515,12 +513,21 @@ docker:
echo " 💡 Безопасно: игнорирует ошибки"; \ echo " 💡 Безопасно: игнорирует ошибки"; \
echo ""; \ echo ""; \
echo " 🧹 make docker clean-builder - очистка multi-arch builder"; \ echo " 🧹 make docker clean-builder - очистка multi-arch builder"; \
echo " 💡 Удаляет: builder контейнер"; \ echo " 💡 Удаляет: builder контейнер и buildkit контейнеры"; \
echo " 💡 Полезно: при проблемах со сборкой"; \ echo " 💡 Полезно: при проблемах со сборкой"; \
echo ""; \ echo ""; \
echo " 🔧 make docker setup-builder - настройка multi-arch builder"; \ echo " 🔧 make docker setup-builder - настройка multi-arch builder"; \
echo " 💡 Создает: builder в контейнере (не в системе)"; \ echo " 💡 Создает: builder в контейнере (не в системе)"; \
echo " 💡 Поддерживает: amd64 и arm64 архитектуры"; \ 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 ""; \
echo " 📊 make docker info - информация о собранных образах"; \ echo " 📊 make docker info - информация о собранных образах"; \
echo " 💡 Показывает: размер, дата создания, теги"; \ echo " 💡 Показывает: размер, дата создания, теги"; \
@@ -540,6 +547,93 @@ docker:
# ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ДЛЯ 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 <name>)"
@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: docker-get-base-tag:
@@ -687,7 +781,10 @@ help:
@echo "🔧 DOCKER BUILDER (Multi-Arch):" @echo "🔧 DOCKER BUILDER (Multi-Arch):"
@echo " make docker setup-builder - настройка multi-arch builder в контейнере" @echo " make docker setup-builder - настройка multi-arch builder в контейнере"
@echo " make docker clean-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 " 💡 Поддерживает: amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6"
@echo " 💡 Безопасно: использует inspect вместо buildx ls (избегает зависаний)"
@echo "" @echo ""
@echo "🔐 VAULT (управление секретами):" @echo "🔐 VAULT (управление секретами):"
@echo " make vault create - создать новый файл секретов" @echo " make vault create - создать новый файл секретов"
@@ -715,6 +812,8 @@ help:
@echo " make presets test PRESET=etcd-patroni # тест с etcd-patroni" @echo " make presets test PRESET=etcd-patroni # тест с etcd-patroni"
@echo " make role test minimal # быстрый тест" @echo " make role test minimal # быстрый тест"
@echo " make docker setup-builder # настройка multi-arch builder" @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 build # собрать все образы (amd64 + arm64)"
@echo " make docker rebuild # полная пересборка с очисткой кеша" @echo " make docker rebuild # полная пересборка с очисткой кеша"
@echo " make controller build # собрать ansible-controller (multi-arch)" @echo " make controller build # собрать ansible-controller (multi-arch)"
@@ -726,5 +825,5 @@ help:
@echo "==========================================" @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 @true

98
docs/buildx-fixes.md Normal file
View File

@@ -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

115
scripts/test-buildx-fixes.sh Executable file
View File

@@ -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 проблем готовы к использованию!"