Как настроить Docker для CI/CD (GitLab CI, GitHub Actions)?
Подробный ответ
Типичный pipeline
Получить исходный код.
Запустить линтеры и тесты.
Собрать Docker image.
Проверить image на уязвимости и при необходимости подписать его.
Присвоить version tag и commit SHA tag.
Опубликовать image в registry.
Деплоить конкретный 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 }}:latestGitLab 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, а не пересобираю образ на каждом окружении.
Оцени свой прогресс