Использование Docker в процессах CI/CD (Continuous Integration / Continuous Delivery) — это стандарт индустрии, который позволяет изолировать среду сборки и тестирования. GitHub Actions предоставляет мощные инструменты для работы с контейнерами, позволяя запускать задачи (Jobs) и отдельные шаги (Steps) внутри специфических образов.
В этой статье мы разберем, как настроить запуск Job в Docker-контейнере, использовать различные версии окружений и подключать дополнительные сервисы, такие как базы данных.
Зачем запускать Job в контейнере?
По умолчанию GitHub Actions запускает воркеры на стандартных виртуальных машинах (например, ubuntu-latest). Однако часто возникают ситуации, когда вашему приложению требуется:
- Конкретная версия Node.js, Python или PHP, которой нет в стандартном образе.
- Специфическая операционная система (например, Alpine Linux для минимизации размера).
- Предустановленные системные зависимости и библиотеки.
Запуск всей задачи внутри контейнера гарантирует, что среда выполнения будет идентична на всех этапах разработки.
Настройка Docker-контейнера для Job
Чтобы запустить задачу в контейнере, в файле конфигурации workflow (.yml) необходимо использовать параметр container.
Базовая конфигурация
Рассмотрим пример запуска задачи в контейнере с Node.js определенной версии:
name: Docker Container Workflow
on: [push]
jobs:
test-job:
runs-on: ubuntu-latest
container:
image: node:21-alpine
steps:
- name: Check Environment
run: |
node -v
cat /etc/os-release
В данном примере, несмотря на то что runs-on указывает на Ubuntu, выполнение всех шагов внутри test-job будет происходить в контейнере node:21-alpine. Это легко проверить по выводу версии ОС — вместо Ubuntu вы увидите Alpine Linux.
Параметры контейнера
Вы можете не просто указывать образ, но и передавать дополнительные параметры:
- env: Переменные окружения, доступные внутри контейнера.
- ports: Проброс портов.
- volumes: Монтирование директорий.
- options: Дополнительные флаги Docker (например,
--user root).
Запуск контейнера на уровне отдельного шага (Step)
GitHub Actions также позволяет использовать Docker для выполнения конкретного шага, а не всей задачи целиком. Это полезно, когда основная работа идет в стандартной среде, но для одной операции (например, сборки специфического модуля) нужен другой образ.
steps:
- name: Run logic in specific Docker image
uses: docker://node:18-alpine
with:
args: node -v
Использование сервисных контейнеров (Services)
Помимо основного рабочего окружения, часто требуются вспомогательные сервисы, например, база данных MySQL или Redis для прохождения тестов. В GitHub Actions это реализуется через секцию services.
jobs:
database-test:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:latest
env:
MYSQL_ROOT_PASSWORD: password
ports:
- 3306:3306
steps:
- name: Test DB Connection
run: echo "Service is running"
GitHub Actions автоматически поднимет контейнер с MySQL, свяжет его с основной сетью вашего Job и позволит обращаться к нему по имени сервиса или через localhost.
Заключение
Интеграция Docker в GitHub Actions делает ваши CI/CD пайплайны гибкими и предсказуемыми. Вы можете:
- Изолировать всю задачу в нужном вам образе.
- Использовать разные контейнеры для разных шагов.
- Легко поднимать базы данных и другие сервисы в соседних контейнерах.
Это избавляет от проблем «у меня на компьютере все работает, а на сервере — нет», так как среда выполнения теперь жестко зафиксирована в коде вашего workflow.

