========================================================= UNIVERSAL MAKEFILE FOR DOCKER AND GIT ========================================================= Автор: Sergey Antropov Версия: 2.0 Описание: Универсальный Makefile для управления Docker-образами, их сборкой, сохранением, загрузкой, публикацией, а также интеграцией с Git. ========================================================= РАЗДЕЛ 1. ОБЩЕЕ ОПИСАНИЕ ========================================================= Makefile предназначен для автоматизации типовых задач DevOps: - сборка Docker-образов (включая Buildx) - сохранение и загрузка архивов образов (save/load) - оффлайн публикация (ретег и push) - логирование всех операций - Git-команды (commit, push, pull, sync) - быстрая проверка сборки через RUN_CMD Все сценарии универсальны, не требуют внешних зависимостей кроме установленного Docker и Git. ========================================================= РАЗДЕЛ 2. ОСНОВНЫЕ КОМАНДЫ ========================================================= Формат вызова: make <группа> <действие> [переменные] --------------------------------------------------------- ГРУППА: docker --------------------------------------------------------- make docker build Собрать Docker-образ. Примеры: make docker build IMAGE=myapp TAG=latest make docker build NO_CACHE=1 make docker build USE_BUILDX=1 PLATFORMS="linux/amd64,linux/arm64" make docker check Проверить образ, запустив RUN_CMD внутри контейнера. Пример: make docker check RUN_CMD="java -version" make docker push Собрать, проверить и отправить образ в registry. Пример: make docker push IMAGE=myapp TAG=v1.0 make docker login Авторизация в Docker Registry. Пример: make docker login REGISTRY=hub.cism-ms.ru make docker save Сохранить локальный образ в архив (tar или tar.gz). Поддерживает разбиение на части. Пример: make docker save SRC_IMAGE=myapp:latest COMPRESS=1 SPLIT_SIZE=2G make docker load Загрузить архив, ретегнуть и (опционально) запушить. Пример: make docker load ARCHIVE=images/myapp.tar LOGIN=1 PUSH_OFFLINE=1 make docker retag Перетегировать образ. Пример: make docker retag NEW_TAG=v2.0 make docker inspect Просмотреть метаданные Docker-образа. make docker clean Очистить временные каталоги logs/ и .offline/. make docker print-config Показать текущие значения всех переменных. make docker create-builder Создать buildx builder для мультиплатформенной сборки. make docker use-builder Активировать ранее созданный builder. --------------------------------------------------------- ГРУППА: git --------------------------------------------------------- make git status Показать текущее состояние репозитория. make git pull Получить последние изменения из origin. make git commit Добавить и закоммитить изменения. Если GIT_MSG не задана — запросит ввод вручную. make git push Создать коммит (если есть изменения) и отправить в origin. make git sync Выполнить pull, commit и push последовательно. ========================================================= РАЗДЕЛ 3. ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ (ПОДРОБНО) ========================================================= Любая переменная может быть переопределена при вызове make: make docker build IMAGE=myapp TAG=v1.0 NO_CACHE=1 --------------------------------------------------------- DOCKER-ПЕРЕМЕННЫЕ --------------------------------------------------------- REGISTRY Адрес Docker Registry без протокола. Пример: hub.cism-ms.ru/library IMAGE Имя Docker-образа (обязательное поле при сборке). TAG Тег образа. По умолчанию: latest. CONTEXT Папка контекста сборки. По умолчанию — текущая директория. DOCKERFILE Имя Dockerfile, используемого при сборке. USE_BUILDX 1 — использовать Docker Buildx (для мультиплатформенной сборки). 0 — обычный docker build. PLATFORMS Целевые платформы для buildx. Пример: linux/amd64,linux/arm64. PUSH 1 — выполнить docker push после buildx. 0 — не выполнять. LOAD 1 — загрузить образ в локальный docker после сборки. 0 — не загружать (актуально для CI/CD). NO_CACHE 1 — сборка без кэша. 0 — использовать кэш. PULL 1 — принудительно обновить базовые образы. 0 — использовать локальные. QUIET 1 — минимальный вывод в консоль. 0 — стандартный. BUILD_ARGS Дополнительные аргументы docker build. Пример: BUILD_ARGS="--build-arg VERSION=1.0 --build-arg DEBUG=1" ARG_FILE Путь к файлу KEY=VALUE. Все пары превращаются в --build-arg KEY=VALUE. RUN_CMD Команда для проверки контейнера после сборки. По умолчанию: lsb_release -a BUILDER Имя buildx builder'а (по умолчанию universal-builder). LOG_DIR Каталог для логов сборок (по умолчанию logs/). LOG_FILE Файл лога, формируется автоматически с датой и временем. --------------------------------------------------------- ОФФЛАЙН-ПЕРЕМЕННЫЕ (SAVE / LOAD) --------------------------------------------------------- ARCHIVE Путь к архиву образа (tar или gz). LOGIN 1 — выполнить docker login перед push. 0 — пропустить. PUSH_OFFLINE 1 — выполнить docker push после загрузки архива. 0 — только загрузить. KEEP_SRC_TAG 1 — использовать тег из архива. 0 — использовать TAG из Makefile. IMAGES_DIR Каталог для сохранения архивов Docker-образов (по умолчанию images/). OFFLINE_DIR Временная служебная папка (.offline). SRC_IMAGE Имя исходного образа для сохранения. COMPRESS 1 — сжать gzip. 0 — оставить tar. SPLIT_SIZE Размер чанка для split (например 2G). LAST_SAVE Путь к последнему сохранённому архиву. --------------------------------------------------------- GIT-ПЕРЕМЕННЫЕ --------------------------------------------------------- GIT_REMOTE Имя удалённого репозитория (по умолчанию origin). GIT_BRANCH Текущая ветка (определяется автоматически). GIT_MSG Сообщение коммита. Если не задано — будет запрошено вручную. --------------------------------------------------------- ПРОЧИЕ --------------------------------------------------------- FULL_IMAGE Полное имя образа REGISTRY/IMAGE:TAG (формируется автоматически). Цвета (COLOR_INFO, COLOR_OK, COLOR_ERR, COLOR_WARN) ANSI-коды для форматирования вывода. Можно обнулить, чтобы отключить цвет в CI. ========================================================= РАЗДЕЛ 4. ПРИМЕРЫ ========================================================= 1. Сборка без кэша: make docker build NO_CACHE=1 2. Сборка и пуш мультиплатформенного образа: make docker build USE_BUILDX=1 PUSH=1 LOAD=0 PLATFORMS="linux/amd64,linux/arm64" 3. Проверка образа: make docker check RUN_CMD="java -version" 4. Сохранение и сжатие: make docker save SRC_IMAGE=myapp:latest COMPRESS=1 5. Загрузка и пуш: make docker load ARCHIVE=images/myapp.tar LOGIN=1 PUSH_OFFLINE=1 6. Коммит и пуш в git: make git push GIT_MSG="Обновлены зависимости" 7. Быстрое обновление ветки: make git sync ========================================================= РАЗДЕЛ 5. ВОЗМОЖНЫЕ ПРОБЛЕМЫ И РЕШЕНИЯ ========================================================= --------------------------------------------------------- 1. Ошибка: "missing separator. Stop." --------------------------------------------------------- Причина: В Makefile должны быть табы, а не пробелы. Решение: Преобразовать пробелы в табы: sed -i 's/^ /\t/' Makefile --------------------------------------------------------- 2. Ошибка: "unknown instruction: yum (did you mean RUN?)" --------------------------------------------------------- Причина: В Dockerfile после инструкции `RUN < --------------------------------------------------------- 5. Ошибка: "docker: command not found" --------------------------------------------------------- Причина: Docker не установлен или не добавлен в PATH. Решение: Установи Docker и проверь: docker version --------------------------------------------------------- 6. Ошибка при push: "unauthorized: authentication required" --------------------------------------------------------- Причина: Не выполнен docker login в registry. Решение: Выполни: make docker login REGISTRY=hub.cism-ms.ru или авторизуйся вручную: docker login hub.cism-ms.ru --------------------------------------------------------- 7. Ошибка: "Образ не найден" --------------------------------------------------------- Причина: Указан неверный SRC_IMAGE или IMAGE не собран. Решение: Убедись, что образ существует: docker images Или собери его: make docker build --------------------------------------------------------- 8. Ошибка checksum при загрузке архива --------------------------------------------------------- Причина: Повреждён файл tar.gz. Решение: Проверить хеш-сумму: sha256sum images/*.sha256 Пересобрать архив: make docker save SRC_IMAGE=myapp:latest COMPRESS=1 --------------------------------------------------------- 9. Ошибка "Git push failed" --------------------------------------------------------- Причина: Нет прав на запись в репозиторий или неверная ветка. Решение: Проверь текущую ветку: git branch Выполни повторно push: make git push GIT_MSG="Обновление" --------------------------------------------------------- 10. Ошибка Buildx: "no builder instance" --------------------------------------------------------- Причина: Buildx не инициализирован. Решение: Создай builder: make docker create-builder Затем используй: make docker use-builder ========================================================= РАЗДЕЛ 6. СОВЕТЫ ПО ИСПОЛЬЗОВАНИЮ ========================================================= - Всегда задавай REGISTRY и IMAGE при сборке. - Для CI/CD добавь NO_CACHE=1 и QUIET=1. - Для оффлайн-деплоя используй SAVE/LOAD. - Git-команды можно вызывать без аргументов — Makefile запросит сообщение сам. - Если часто работаешь с конкретными параметрами — создай файл `.env` или `Makefile.local`. ========================================================= ЛИЦЕНЗИЯ ========================================================= MIT License Свободно для использования в любых проектах. =========================================================