Вот подробное и структурированное описание пайплайна развертывания с использованием Docker и удалённого хоста, которое можно использовать как документацию или комментарий в .gitlab-ci.yml:
Описание пайплайна: Развертывание приложения через Docker Compose с аутентификацией в приватном реестре
Этот пайплайн предназначен для безопасного развертывания приложения на удалённом Docker-хосте с использованием docker context и docker compose. Он поддерживает защищённое подключение к Docker-демону по TLS и аутентификацию в приватном Docker-реестре (например, Nexus).
Назначение
- Автоматическое развертывание сервисов, описанных в
docker-compose.yml, на удалённом хосте. - Поддержка развёртывания в разные окружения (например,
test,staging). - Работа с защищённым Docker-демоном (через TLS-сертификаты).
- Аутентификация в приватном реестре с использованием base64-закодированного пароля.
Ключевые компоненты
Аутентификация в Docker-реестре
Используется безопасный способ входа через --password-stdin:
.docker_login_stdin_base64: &docker-login-stdin-base64
- echo $REGISTRY_PASSWORD | base64 -d | docker login -u $REGISTRY_USER $REGISTRY --password-stdin
Пароль передаётся в виде base64-закодированной строки, чтобы избежать проблем с спецсимволами и повысить безопасность в логах.
Удалённое подключение к Docker (Docker Context)
Создаётся отдельный контекст для безопасного подключения к удалённому хосту:
.docker_context_create: &docker-context-create
- docker context create ${CI_PROJECT_NAME}-${ENV} --docker "host=tcp://${HOST},ca=${CA_FILE},cert=${CERT_FILE},key=${KEY_FILE}"
Используются TLS-сертификаты (
ca,cert,key) для аутентификации на Docker-хосте.
Развертывание через Docker Compose
.docker_context_deploy: &docker-context-deploy
- DOCKER_CONTEXT=... docker compose -f docker-compose.yml pull
- DOCKER_CONTEXT=... docker compose -f docker-compose.yml up -d --force-recreate
Обновляет образы и перезапускает контейнеры с принудительным пересозданием.
Этапы выполнения (deploy)
- Вывод переменных окружения (
env | sort) — для отладки и аудита. - Логин в Docker-реестр — с расшифровкой пароля из base64.
- Создание Docker-контекста — подключение к удалённому хосту по TLS.
- Развертывание сервисов:
- Скачивание актуальных образов (
pull). - Запуск сервисов в фоне с пересозданием (
up -d --force-recreate).
- Скачивание актуальных образов (
Переменные окружения
| Переменная | Обязательная | Описание |
|---|---|---|
ENV |
Да | Имя окружения (например, test, staging) |
HOST |
Да | Адрес удалённого Docker-хоста (например, example.com:2376) |
CA_FILE |
Да | Содержимое файла ca.pem (TLS) |
CERT_FILE |
Да | Содержимое cert.pem |
KEY_FILE |
Да | Содержимое key.pem |
REGISTRY_USER |
Да | Пользователь реестра (например, nexus) |
REGISTRY_PASSWORD |
Да | Base64-закодированный пароль для доступа к реестру |
REGISTRY |
Да | URL Docker-реестра (например, nexus.example.com:5000) |
COMPOSE_FILES |
Нет (по умолч. -f docker-compose.yml) |
Дополнительные файлы Compose (например, -f docker-compose.prod.yml) |
DOCKER_IMAGE |
Да | Образ, в котором запускается пайплайн (с установленным Docker CLI) |
Рекомендуется хранить
CA_FILE,CERT_FILE,KEY_FILEиREGISTRY_PASSWORDкак CI/CD Variables в GitLab (с флагом "Masked", если возможно).
Теги и образ
- Образ:
${DOCKER_IMAGE}— должен содержатьdockerCLI и поддерживатьdocker contextиdocker compose. - Окружение: Указывается как
environment: name: ${ENV}— отображается в GitLab CI. - Стадия:
deploy— выполняется на этапе развертывания.
Безопасность
- Пароль реестра не передаётся напрямую, а декодируется из base64.
- Подключение к Docker-хосту — по TLS, с использованием сертификатов.
- Все чувствительные данные передаются через защищённые CI-переменные.
Пример использования
- Убедитесь, что в CI/CD Variables заданы:
NEXUS_PASS_BASE64— base64-код пароля.CA_FILE,CERT_FILE,KEY_FILE— содержимое сертификатов.
- Запустите пайплайн вручную.
- Выберите окружение (например,
test) и убедитесь, что переменныеHOSTиENVкорректны.
Примечания
- Убедитесь, что удалённый Docker-демон разрешает подключения по TCP с вашего CI-раннера.
- Файлы сертификатов должны быть полностью вставлены в переменные (включая
-----BEGIN CERTIFICATE-----и т.д.). - Для разных окружений можно создавать отдельные джобы с переопределением
ENV,HOSTи т.д.
Назначение: Быстрое и безопасное развертывание приложений в тестовых/стейджинг окружениях с использованием Docker и приватного реестра.
Рекомендуется использовать с GitLab CI, Docker 20.10+, и настроенным TLS на Docker-хосте.