Гайд по работе с Docker в Lowcode Platform
Этот документ объясняет, как устроены Docker-файлы, как запускать dev-окружение и тестовый контур, как выполнять очистку, откуда Docker берёт конфигурацию, и как всё это интегрировано в CI/CD.
1. Общая архитектура Docker
Lowcode Platform использует Docker в двух сценариях:
- Dev-окружение для локальной разработки (
docker-compose.dev.yml). - Test-окружение для e2e тестов (
docker-compose.test.yml).
Базовый образ API собирается через infra/docker/Dockerfile.api.
Схема:
Dockerfile.api
├── stage deps → ставит node_modules
├── stage dev → копирует repo и готовит API
└── stage prod → финальный runtime
Dev/test compose-файлы используют stage dev, который содержит весь монорепозиторий + node_modules.
2. Dockerfile.api — устройство
Файл расположен по адресу:
infra/docker/Dockerfile.api
Он содержит три стадии:
2.1. deps
- ставит Node.js
- включает corepack (для pnpm)
- устанавливает системные пакеты
- копирует package.json и pnpm-lock.yaml
- устанавливает зависимости командой
pnpm install --frozen-lockfile
2.2. dev
- копирует весь репозиторий внутрь контейнера
- генерирует Prisma Client (
prisma generate)
Эта стадия используется dev/test окружениями.
2.3. prod
- минимальный образ
- копирует dist и node_modules
- запускает приложение
Этот stage используется CI/CD в будущем для deployment.
3. Dev окружение (docker-compose.dev.yml)
Файл:
infra/docker/docker-compose.dev.yml
Запускает:
✔ db — PostgreSQL 16
- хранит данные в volume
docker_docker_pgdata - не пробрасывает порт наружу, чтобы БД была только внутри Docker Network
✔ api-dev
- собирает контейнер из
Dockerfile.api(stage dev) - запускает миграции
- запускает API в режиме разработки (
pnpm dev) - пробрасывает порт
3000:3000
✔ Health-check
Fastify не предоставляет /health по умолчанию, поэтому в dev окружении используется:
wget -qO- http://localhost:3000/projects
Если API отвечает — контейнер считается healthy.
3.1. Запуск dev окружения
docker compose -f infra/docker/docker-compose.dev.yml up --build
3.2. Остановка
docker compose -f infra/docker/docker-compose.dev.yml down
3.3. Полная очистка DB
docker compose -f infra/docker/docker-compose.dev.yml down -v
Это удалит volume docker_docker_pgdata.
4. Test окружение (docker-compose.test.yml)
Используется локально и в CI.
Файл:
infra/docker/docker-compose.test.yml
Запускает:
✔ db — БД для e2e тестов
С параметрами:
POSTGRES_USER=lowcode_user
POSTGRES_PASSWORD=lowcode_password
POSTGRES_DB=lowcode_test
✔ api-test
Выполняет полный тестовый цикл:
1. prisma migrate dev
2. pnpm test
3. pnpm test:e2e
Контейнер завершается автоматически, а docker compose остаётся жить из-за Postgres.
4.1. Быстрый запуск тестов локально
Поднять только БД
docker compose -f infra/docker/docker-compose.test.yml up -d db
Запустить тесты
docker compose -f infra/docker/docker-compose.test.yml run --rm api-test
Очистить всё
docker compose -f infra/docker/docker-compose.test.yml down -v
5. Работа .env файлов
Prisma в контейнере загружает переменные среды из:
.env, если он внутри репозитория- переменные
environment:в docker-compose - переменные, переданные при запуске (
-e FOO=bar)
В dev/test окружениях приоритет такой:
docker-compose → .env → default значения
Например, dev окружение задаёт:
DATABASE_URL=postgresql://lowcode:lowcode@db:5432/lowcode
А тестовое:
DATABASE_URL=postgres://lowcode_user:lowcode_password@db:5432/lowcode_test
6. Подключение к базе данных внутри контейнера
База данных не пробрасывается наружу, поэтому подключение возможно только изнутри Docker Network.
Чтобы войти в БД dev окружения:
docker exec -it lowcode-postgres psql -U lowcode lowcode
Для test окружения:
docker exec -it lowcode-postgres-test psql -U lowcode_user lowcode_test
Миграции применяются автоматически при старте API.
7. Интеграция Docker в CI/CD
GitHub Actions запускают тесты через:
docker compose -f infra/docker/docker-compose.test.yml up --build --abort-on-container-exit --exit-code-from api-test
Пояснение флагов:
--abort-on-container-exit→ когдаapi-testзавершился, Docker гасит остальные контейнеры--exit-code-from api-test→ код завершения из e2e тестов = код завершения CI job
То есть:
- если тесты зелёные → CI проходит
- если e2e упали → CI красный
В будущем
Stage prod из Dockerfile будет использоваться для деплоймента:
- публикации Docker-образов в container registry
- развёртывания в NestJS runtime-хосте
8. Какие требования предъявляются к Docker-файлам
-
Детерминированная сборка — зависит только от package.json, pnpm-lock.yaml и контента монорепы.
-
Минимальный набор зависимостей в prod-образе.
-
Возможность сборки всего приложения или отдельных пакетов.
-
Совместимость с CI/CD, включая:
- генерацию Prisma Client
- запуск миграций
- запуск unit/e2e тестов
-
Health-checks для dev/prod контейнеров.
-
Быстрая сборка (stage deps кешируется).
9. Частые команды Docker (чеклист)
Пересобрать dev окружение
docker compose -f infra/docker/docker-compose.dev.yml up --build
Запустить e2e тесты в чистом окружении
docker compose -f infra/docker/docker-compose.test.yml down -v
docker compose -f infra/docker/docker-compose.test.yml up --build
Удалить ВСЕ контейнеры и volume в проекте
docker compose -f infra/docker/docker-compose.dev.yml down -v
docker compose -f infra/docker/docker-compose.test.yml down -v
Посмотреть контейнеры
docker ps -a
Удалить один контейнер
docker rm <na