feat(makefile): add docker pull/rebuild and dual tags (TAG1/TAG2); drop TAG\n\n- build/rebuild now tag with TAG1/TAG2\n- add docker pull (both tags)\n- push handles both tags\n- docs updated (README, docs/*)\n- examples migrated to TAG1/TAG2

This commit is contained in:
Сергей Антропов
2025-10-30 11:21:00 +03:00
parent d9900527f1
commit c583bdbe59
6 changed files with 166 additions and 103 deletions

View File

@@ -4,32 +4,32 @@
### Семантическое версионирование
```bash
# Основные версии
TAG=v1.0.0 # Стабильная версия
TAG=v1.1.0 # Новая функциональность
TAG=v1.1.1 # Исправления ошибок
# Основной и дополнительный тег (двойное тегирование)
TAG1=latest TAG2=v1.0.0 # Рекомендуемый минимум: стабильный alias + версия
TAG1=stable TAG2=v1.1.0 # Пример для стабильной ветки
TAG1=dev # Разработка без второго тега
# Предварительные версии
TAG=v1.2.0-alpha.1
TAG=v1.2.0-beta.1
TAG=v1.2.0-rc.1
# Предрелизные версии
TAG1=rc TAG2=v1.2.0-rc.1
TAG1=beta TAG2=v1.2.0-beta.1
TAG1=alpha TAG2=v1.2.0-alpha.1
# Специальные теги
TAG=latest # Последняя стабильная
TAG=dev # Разработка
TAG=stable # Стабильная ветка
# Специальные алиасы
TAG1=latest
TAG1=stable
TAG1=dev
```
### Автоматическое версионирование
```bash
# Использование Git commit hash
TAG=$(git rev-parse --short HEAD)
TAG1=$(git rev-parse --short HEAD)
# Использование даты
TAG=$(date +%Y%m%d-%H%M%S)
TAG1=$(date +%Y%m%d-%H%M%S)
# Использование Git тегов
TAG=$(git describe --tags --always)
TAG1=$(git describe --tags --always)
```
## 2. Безопасность
@@ -92,7 +92,7 @@ coverage
# Создание логов с метаданными
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=v1.0.0 \
BUILD_ARGS="--build-arg BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
LOG_DIR=./build-logs
```
@@ -116,21 +116,21 @@ docker run --rm -it \
### Кэширование слоев Docker
```bash
# Сборка с использованием кэша
make docker build IMAGE=myapp TAG=v1.0.0
make docker build IMAGE=myapp TAG1=v1.0.0
# Сборка без кэша (для чистых сборок)
make docker build IMAGE=myapp TAG=v1.0.0 NO_CACHE=1
make docker rebuild IMAGE=myapp TAG1=v1.0.0
# Принудительное обновление базовых образов
make docker build IMAGE=myapp TAG=v1.0.0 PULL=1
make docker build IMAGE=myapp TAG1=v1.0.0 PULL=1
```
### Параллельная сборка
```bash
# Сборка нескольких образов параллельно
make docker build IMAGE=frontend TAG=v1.0.0 &
make docker build IMAGE=backend TAG=v1.0.0 &
make docker build IMAGE=worker TAG=v1.0.0 &
make docker build IMAGE=frontend TAG1=v1.0.0 &
make docker build IMAGE=backend TAG1=v1.0.0 &
make docker build IMAGE=worker TAG1=v1.0.0 &
wait
# Проверка результатов
@@ -142,7 +142,7 @@ docker images | grep -E "(frontend|backend|worker)"
# Сборка с минимальным размером
make docker build \
IMAGE=myapp \
TAG=minimal \
TAG1=minimal \
BUILD_ARGS="--build-arg BUILDKIT_INLINE_CACHE=1"
# Сжатие образов
@@ -158,13 +158,13 @@ make docker save \
# Сборка базового образа
make docker build \
IMAGE=base-image \
TAG=ubuntu-22.04 \
TAG1=ubuntu-22.04 \
DOCKERFILE=Dockerfile.base
# Использование базового образа
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=v1.0.0 \
BUILD_ARGS="--build-arg BASE_IMAGE=base-image:ubuntu-22.04"
```
@@ -173,7 +173,7 @@ make docker build \
# Обновление базовых образов
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=v1.0.0 \
PULL=1
# Проверка обновлений
@@ -211,10 +211,10 @@ docker run -it --rm \
### Измерение времени сборки
```bash
# Время сборки
time make docker build IMAGE=myapp TAG=v1.0.0
time make docker build IMAGE=myapp TAG1=v1.0.0
# Детальная статистика
make docker build IMAGE=myapp TAG=v1.0.0 2>&1 | tee build.log
make docker build IMAGE=myapp TAG1=v1.0.0 2>&1 | tee build.log
```
### Мониторинг ресурсов
@@ -253,7 +253,7 @@ project/
cat > Makefile.local << EOF
REGISTRY=my-registry.com
IMAGE=my-project
TAG=dev
TAG1=dev
NO_CACHE=0
QUIET=0
EOF

View File

@@ -4,26 +4,26 @@
### Простая сборка
```bash
# Сборка с минимальными параметрами
make docker build IMAGE=myapp TAG=latest
# Сборка с двойными тегами
make docker build IMAGE=myapp TAG1=latest TAG2=v1.0.0
# Сборка с кастомным registry
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=latest TAG2=v1.0.0 \
REGISTRY=hub.cism-ms.ru/library
# Сборка с проверкой
make docker build IMAGE=myapp TAG=v1.0.0
make docker build IMAGE=myapp TAG1=latest TAG2=v1.0.0
make docker check RUN_CMD="lsb_release -a"
```
### Полный цикл сборки и публикации
```bash
# 1. Сборка образа
# 1. Сборка образа (двойные теги)
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=latest TAG2=v1.0.0 \
REGISTRY=hub.cism-ms.ru/library
# 2. Проверка работоспособности
@@ -33,7 +33,7 @@ make docker check \
# 3. Публикация в registry
make docker push \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=latest TAG2=v1.0.0 \
REGISTRY=hub.cism-ms.ru/library
```
@@ -56,7 +56,7 @@ docker buildx inspect --bootstrap
# Сборка для AMD64 и ARM64
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=latest TAG2=v1.0.0 \
USE_BUILDX=1 \
PLATFORMS="linux/amd64,linux/arm64" \
PUSH=1 \
@@ -65,7 +65,7 @@ make docker build \
# Сборка для всех популярных платформ
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=latest TAG2=v1.0.0 \
USE_BUILDX=1 \
PLATFORMS="linux/amd64,linux/arm64,linux/arm/v7" \
PUSH=1
@@ -106,7 +106,7 @@ make docker load \
ARCHIVE=images/myapp_v1.0.0.tar.gz \
REGISTRY=hub.cism-ms.ru/library \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=v1.0.0 \
LOGIN=1 \
PUSH_OFFLINE=1
@@ -125,13 +125,13 @@ make docker load \
# Передача переменных окружения
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=v1.0.0 \
BUILD_ARGS="--build-arg VERSION=1.0.0 --build-arg NODE_ENV=production"
# Передача пользовательских данных
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=v1.0.0 \
BUILD_ARGS="--build-arg USER_ID=1000 --build-arg GROUP_ID=1000"
```
@@ -279,13 +279,13 @@ make docker check RUN_CMD="env | grep -E 'VERSION|NODE_ENV'"
# Сборка с Dockerfile.prod
make docker build \
IMAGE=myapp \
TAG=production \
TAG1=production \
DOCKERFILE=Dockerfile.prod
# Сборка с контекстом в подпапке
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=v1.0.0 \
CONTEXT=./app
```
@@ -294,31 +294,37 @@ make docker build \
# Сборка для локального registry
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=v1.0.0 \
REGISTRY=localhost:5000
# Сборка для Docker Hub
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=v1.0.0 \
REGISTRY=myusername
# Сборка для GitLab Registry
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=v1.0.0 \
REGISTRY=registry.gitlab.com/myproject
```
### Управление тегами
```bash
# Перетегирование образа
# Перетегирование образа (локально)
make docker retag NEW_TAG=v2.0.0
# Создание нескольких тегов
make docker retag NEW_TAG=latest
make docker retag NEW_TAG=stable
make docker retag NEW_TAG=2024.01.15
# Пулл обоих тегов
make docker pull IMAGE=myapp TAG1=latest TAG2=v2.0.0 REGISTRY=hub.cism-ms.ru/library
# Пересборка без кэша с двумя тегами
make docker rebuild IMAGE=myapp TAG1=latest TAG2=v2.0.0
```
## 9. Очистка и обслуживание

View File

@@ -6,10 +6,10 @@
**A:** Установите WSL2 или используйте Git Bash:
```bash
# В Git Bash
make docker build IMAGE=myapp TAG=latest
make docker build IMAGE=myapp TAG1=latest TAG2=v1.0.0
# Или через WSL2
wsl make docker build IMAGE=myapp TAG=latest
wsl make docker build IMAGE=myapp TAG1=latest TAG2=v1.0.0
```
### Q: Можно ли использовать с Docker Compose?
@@ -30,14 +30,14 @@ services:
```bash
# .git/hooks/post-commit
#!/bin/bash
make docker build IMAGE=myapp TAG=$(git rev-parse --short HEAD)
make docker build IMAGE=myapp TAG1=$(git rev-parse --short HEAD)
```
### Q: Можно ли использовать с Kubernetes?
**A:** Да, после сборки образа:
```bash
# Сборка образа
make docker build IMAGE=myapp TAG=v1.0.0
make docker build IMAGE=myapp TAG1=v1.0.0
# Применение в Kubernetes
kubectl apply -f k8s/
@@ -47,7 +47,7 @@ kubectl apply -f k8s/
**A:** Используйте кэширование и .dockerignore:
```bash
# Сборка с кэшем
make docker build IMAGE=myapp TAG=v1.0.0
make docker build IMAGE=myapp TAG1=v1.0.0
# Создание .dockerignore
echo "node_modules" >> .dockerignore
@@ -86,7 +86,7 @@ make docker push IMAGE=myapp TAG=v1.0.0 REGISTRY=your-private-registry.com
# Сборка для ARM64
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
TAG1=v1.0.0 \
USE_BUILDX=1 \
PLATFORMS=linux/arm64
```

View File

@@ -6,9 +6,11 @@
| Команда | Описание | Пример |
|---------|----------|--------|
| `make docker build` | Собрать Docker-образ | `make docker build IMAGE=myapp TAG=v1.0` |
| `make docker build` | Собрать Docker-образ (двойные теги) | `make docker build IMAGE=myapp TAG1=latest TAG2=v1.0` |
| `make docker check` | Проверить образ | `make docker check RUN_CMD="java -version"` |
| `make docker push` | Собрать + проверить + отправить | `make docker push IMAGE=myapp TAG=v1.0` |
| `make docker push` | Собрать + проверить + отправить (оба тега) | `make docker push IMAGE=myapp TAG1=latest TAG2=v1.0` |
| `make docker rebuild` | Пересобрать без кэша (оба тега) | `make docker rebuild IMAGE=myapp TAG1=latest TAG2=v1.0` |
| `make docker pull` | Скачать/обновить образы по тегам | `make docker pull IMAGE=myapp TAG1=latest TAG2=v1.0` |
| `make docker save` | Сохранить образ в архив | `make docker save SRC_IMAGE=myapp:latest` |
| `make docker load` | Загрузить из архива | `make docker load ARCHIVE=images/myapp.tar` |
| `make docker login` | Авторизация в registry | `make docker login REGISTRY=hub.cism-ms.ru` |
@@ -50,15 +52,14 @@ IMAGE=web-frontend
IMAGE=api-backend
```
#### TAG
**Описание:** Тег образа
**По умолчанию:** `latest`
#### TAG1 / TAG2
**Описание:** Основной и дополнительный тег образа (двойное тегирование)
**По умолчанию:** `TAG1=latest`, `TAG2=v.0.0.1`
**Примеры:**
```bash
TAG=latest
TAG=v1.0.0
TAG=dev
TAG=2024.01.15
TAG1=latest TAG2=v1.0.0
TAG1=stable TAG2=v1.0.1
TAG1=dev # без второго тега
```
#### CONTEXT
@@ -344,13 +345,16 @@ GIT_MSG="Обновлены зависимости"
### Служебные переменные
#### FULL_IMAGE
**Описание:** Полное имя образа REGISTRY/IMAGE:TAG
**Формируется автоматически:** `$(REGISTRY)/$(IMAGE):$(TAG)`
#### FULL_IMAGE / FULL_IMAGE_1 / FULL_IMAGE_2
**Описание:** Полные имена образов
**Формируется автоматически:**
- `FULL_IMAGE` = `$(REGISTRY)/$(IMAGE):$(TAG1)`
- `FULL_IMAGE_1` = `$(REGISTRY)/$(IMAGE):$(TAG1)`
- `FULL_IMAGE_2` = `$(REGISTRY)/$(IMAGE):$(TAG2)`
**Примеры:**
```bash
FULL_IMAGE=hub.cism-ms.ru/library/myapp:latest
FULL_IMAGE=registry.local/myapp:v1.0.0
FULL_IMAGE_1=hub.cism-ms.ru/library/myapp:latest
FULL_IMAGE_2=hub.cism-ms.ru/library/myapp:v1.0.0
```
#### Цвета вывода