Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Работа с реестрами образов
docker_registry

Работа с реестрами образов

Публикация образов в GHCR, GitLab Registry, управление версиями и тегами.

Работа с реестрами образов

Docker-реестры — центральное звено CI/CD для хранения и распространения образов. Изучите работу с GHCR, GitLab Registry и управление версиями образов.

#Что такое Docker Registry?

Docker Registry — сервер для хранения и распространения Docker-образов.

┌──────────────────────────────────────────────────────────────┐
│                    CI/CD Pipeline                            │
│                                                               │
│  ┌──────────┐      ┌─────────────┐      ┌─────────────┐    │
│  │  Build   │  →   │   Registry  │  →   │   Deploy    │    │
│  │  Image   │  push│  (GHCR,     │ pull │  to Prod    │    │
│  │          │      │   GitLab)   │      │             │    │
│  └──────────┘      └─────────────┘      └─────────────┘    │
└──────────────────────────────────────────────────────────────┘

Популярные реестры:

РеестрURLОсобенности
Docker Hubdocker.ioПубличный, бесплатный с ограничениями
GHCRghcr.ioИнтеграция с GitHub, приватные образы
GitLab Registryregistry.gitlab.comВстроен в GitLab, пер-проект реестр
AWS ECR<account>.dkr.ecr.<region>.amazonaws.comИнтеграция с AWS
GCP Artifact Registry<location>-docker.pkg.devИнтеграция с GCP
Azure ACR<name>.azurecr.ioИнтеграция с Azure

#GitHub Container Registry (GHCR)

#Аутентификация в GHCR

# Логин с токеном echo $GITHUB_TOKEN | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin # Логин с PAT (Personal Access Token) echo $PAT | docker login ghcr.io -u $USERNAME --password-stdin

#Публикация образа в GHCR из GitHub Actions

name: Build and Push to GHCR on: push: branches: [main] tags: - 'v*' env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: build-and-push: runs-on: ubuntu-latest permissions: contents: read packages: write # Важно для записи в GHCR steps: - name: Checkout repository uses: actions/checkout@v4 - name: Log in to GHCR uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=sha,prefix= type=semver,pattern={{version}} type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} - name: Build and push uses: docker/build-push-action@v5 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}

#Настройка видимости образа в GHCR

Важно: По умолчанию образы приватные. Для публичного доступа:

  1. Перейдите в Package settings образа на GitHub
  2. В разделе Danger Zone выберите Change visibility
  3. Или настройте доступ для конкретных организаций/пользователей
# Для организации добавьте permissions permissions: packages: write contents: read

#GitLab Container Registry

#Автоматическая аутентификация в GitLab CI

GitLab CI автоматически предоставляет переменные для доступа к реестру:

# .gitlab-ci.yml variables: # Доступно автоматически в GitLab CI # CI_REGISTRY: registry.gitlab.com # CI_REGISTRY_IMAGE: registry.gitlab.com/group/project # CI_REGISTRY_USER: username # CI_REGISTRY_PASSWORD: token build: stage: build image: docker:24-dind services: - docker:24-dind variables: DOCKER_TLS_CERTDIR: "" script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

#Настройка реестра проекта

В GitLab UI:

  1. Settings → General → Visibility, project features, permissions
  2. Merge requests → Container Registry
  3. Выберите уровень доступа: Private, Internal, Public

#Тегирование в GitLab CI

build: script: # Тег с SHA коммита - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . # Тег с ветки - docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME # Тег latest для main - | if [ "$CI_COMMIT_REF_NAME" = "main" ]; then docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest fi # Push всех тегов - docker push -a $CI_REGISTRY_IMAGE

#Стратегии тегирования

#Семантическое версионирование (SemVer)

MAJOR.MINOR.PATCH
  │      │      └─ Исправления обратной совместимости
  │      └──────── Новые функции с обратной совместимостью
  └─────────────── Breaking changes
# GitHub Actions для semver on: push: tags: - 'v*' # v1.0.0, v2.1.3, etc. jobs: build: steps: - name: Extract version from tag id: version run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT - name: Build with version tag uses: docker/build-push-action@v5 with: tags: | ghcr.io/user/app:${{ steps.version.outputs.VERSION }} ghcr.io/user/app:latest

#Тегирование по SHA коммита

# Уникальный тег для каждого коммита tags: | type=sha,prefix= type=sha,prefix=,format=long

Результат:

  • ghcr.io/user/app:a1b2c3d (короткий SHA)
  • ghcr.io/user/app:a1b2c3d4e5f6... (полный SHA)

#Комбинированное тегирование

# Несколько тегов для одного образа tags: | type=ref,event=branch type=ref,event=pr type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} type=sha type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}

Пример для тега v1.2.3 на main:

  • user/app:1.2.3
  • user/app:1.2
  • user/app:1
  • user/app:latest
  • user/app:a1b2c3d

#Очистка реестра

#Удаление untagged образов в GHCR

Через GitHub UI:

  1. Перейдите в Packages
  2. Выберите образ
  3. Version list → Untagged images
  4. Delete untagged images

Через API:

# Получить список untagged образов curl -H "Authorization: Bearer $TOKEN" \ https://ghcr.io/v2/user/app/tags/list # Удалить конкретный тег curl -X DELETE -H "Authorization: Bearer $TOKEN" \ https://ghcr.io/v2/user/app/manifests/<digest>

#Автоматическая очистка workflow

name: Cleanup Old Images on: schedule: - cron: '0 0 * * 0' # Каждое воскресенье workflow_dispatch: jobs: cleanup: runs-on: ubuntu-latest steps: - name: Delete untagged images uses: actions/delete-package-versions@v5 with: package-name: 'my-app' package-type: 'container' min-versions-to-keep: 10 delete-only-untagged-versions: true token: ${{ secrets.GITHUB_TOKEN }} - name: Delete old tagged versions uses: actions/delete-package-versions@v5 with: package-name: 'my-app' package-type: 'container' min-versions-to-keep: 5 delete-only-untagged-versions: false

#Очистка GitLab Registry

# .gitlab-ci.yml cleanup: stage: cleanup image: curlimages/curl:latest rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH script: # Удалить старые теги через API - | curl --request DELETE --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/registry/repositories/$REGISTRY_ID/tags/$TAG_NAME"

#Мульти-реестр стратегия

#Публикация в несколько реестров

name: Push to Multiple Registries on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # Логин в GHCR - name: Login to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # Логин в Docker Hub - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} # Логин в ECR - name: Login to ECR uses: docker/login-action@v3 with: registry: ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com username: AWS password: ${{ secrets.AWS_ECR_TOKEN }} - name: Build and push to all registries uses: docker/build-push-action@v5 with: tags: | ghcr.io/user/app:${{ github.sha }} user/app:${{ github.sha }} ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/app:${{ github.sha }} push: true

#Безопасность реестров

#Сканирование образов на уязвимости

name: Scan for Vulnerabilities on: push: branches: [main] jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build image run: docker build -t app:${{ github.sha }} . - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@master with: image-ref: 'app:${{ github.sha }}' format: 'sarif' output: 'trivy-results.sarif' - name: Upload to GitHub Security tab uses: github/codeql-action/upload-sarif@v3 with: sarif_file: 'trivy-results.sarif'

#Подписывание образов (Cosign)

name: Sign Container Image on: push: tags: - 'v*' jobs: build-and-sign: runs-on: ubuntu-latest permissions: contents: read packages: write id-token: write # Для OIDC steps: - uses: actions/checkout@v4 - name: Login to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v5 with: tags: ghcr.io/user/app:${{ github.ref_name }} push: true - name: Sign image with Cosign uses: sigstore/cosign-installer@v3 with: cosign-release: 'v2.2.2' - name: Sign the image run: | cosign sign --yes ghcr.io/user/app@${{ steps.digest.outputs.digest }}

#Best Practices

#1. Используйте immutable теги в production

# Плохо — тег может измениться image: myapp:latest # Хорошо — уникальный тег image: myapp:a1b2c3d image: myapp:v1.2.3

#2. Не используйте latest для production

# Избегайте в production tags: - latest # Только для dev/test # Используйте для production tags: - ${{ github.sha }} - ${{ github.ref_name }}

#3. Настройте retention policies

# Автоматическое удаление старых версий - name: Cleanup uses: actions/delete-package-versions@v5 with: min-versions-to-keep: 10

#4. Используйте OIDC для production

# Для AWS ECR с OIDC - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: arn:aws:iam::123456789:role/github-role aws-region: us-east-1 - name: Login to ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v2

#5. Сканируйте образы перед публикацией

- name: Scan before push run: | docker scan app:latest || exit 1

Далее: Оптимизация Docker-сборок