Какую информацию вы указываете в теге (tag) Docker-образа или Git?

«Какую информацию вы указываете в теге (tag) Docker-образа или Git?» — вопрос из категории Git, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Семантичное тегирование — критически важная практика в DevOps для отслеживаемости, развертывания и отката версий. Я использую разные стратегии для Git и Docker.

1. Docker-образы (в Container Registry): Тег содержит идентификатор конкретной сборки и метаданные.

  • Основной семантический тег: {app-name}:{major}.{minor}.{patch} (например, api-service:1.2.3).
  • Тег с привязкой к коммиту (для отслеживаемости): {app-name}:{short-commit-sha} (например, api-service:a1b2c3d). Часто используется в CI для тестирования.
  • Плавающий тег для окружений: {app-name}:latest (для dev), {app-name}:staging, {app-name}:prod. Важно: latest не должен использоваться в продакшене из-за неявности версии.
  • Комбинированный тег (рекомендуемый): {app-name}:{semver}-{short-sha} (например, api-service:1.2.3-a1b2c3d). Дает и версию, и точную ссылку на код.

Пример команды в CI/CD:

# Сборка и тегирование образа
docker build -t my-registry/api-service:1.2.3-${CI_COMMIT_SHORT_SHA} .
docker push my-registry/api-service:1.2.3-${CI_COMMIT_SHORT_SHA}

# Дополнительно проставляем тег 'staging' для деплоя
docker tag my-registry/api-service:1.2.3-${CI_COMMIT_SHORT_SHA} my-registry/api-service:staging
docker push my-registry/api-service:staging

2. Git-теги: Используются для отметки релизов в репозитории. Тег — это постоянная метка на конкретном коммите.

  • Семантическое версионирование: v{major}.{minor}.{patch} (например, v1.2.3).
  • Аннотированные теги с описанием: Содержат информацию о релизе.
    git tag -a v1.2.3 -m "Release 1.2.3
    - Добавлена интеграция с PaymentGateway
    - Исправлена утечка памяти в кэше"
    git push origin v1.2.3

Связь между тегами: Хеш коммита, на который указывает Git-тег v1.2.3, должен совпадать с хешем, из которого был собран Docker-образ с тегом :1.2.3-*. Это обеспечивает полную прослеживаемость от контейнера в кластере до строки кода.