PRO

Как настроить Docker для CI/CD (GitLab CI, GitHub Actions)?

В CI/CD Docker-образ обычно собирают, тестируют, сканируют, тегируют по commit SHA или версии и публикуют в registry. Затем один и тот же неизменяемый image продвигают между окружениями; GitLab CI и GitHub Actions предоставляют jobs и actions для Docker Buildx, login и push.
Подробный ответ

Типичный pipeline

  1. Получить исходный код.

  2. Запустить линтеры и тесты.

  3. Собрать Docker image.

  4. Проверить image на уязвимости и при необходимости подписать его.

  5. Присвоить version tag и commit SHA tag.

  6. Опубликовать image в registry.

  7. Деплоить конкретный digest или immutable tag в нужное окружение.

GitHub Actions

name: Build and push image

on:
  push:
    branches: [main]
    tags: ["v*"]

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-buildx-action@v3
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: |
            ghcr.io/${{ github.repository }}:${{ github.sha }}
            ghcr.io/${{ github.repository }}:latest

GitLab CI

stages:
  - test
  - build

build-image:
  stage: build
  image: docker:27
  services:
    - docker:27-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  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"

Теги образов

Тег latest удобен для разработки, но недостаточен для воспроизводимого production-деплоя. Лучше публиковать теги с версией, commit SHA и при возможности использовать digest образа, который однозначно фиксирует содержимое.

Безопасность и кэш

Секреты registry хранят в CI secrets, а не в YAML. Для ускорения сборок применяют BuildKit и registry cache. Перед публикацией полезно запускать тесты, SBOM или vulnerability scan; критические уязвимости должны блокировать продвижение image.

Как ответить на собеседовании

В CI я собираю и тестирую Docker image, сканирую его, тегирую commit SHA и версией, затем логинюсь в registry через секреты и выполняю push. Для production продвигаю один и тот же immutable image или digest между staging и production, а не пересобираю образ на каждом окружении.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге