Инструкция по настройке Docker для приложения с PostgreSQL и Prisma
1. Структура проекта
Предположим, у вас есть проект на NestJS с использованием Prisma и PostgreSQL. Приблизительная структура проекта:
project/
│
├── prisma/
│ └── schema.prisma # Схема Prisma для вашей базы данных
├── src/ # Исходный код приложения NestJS
├── Dockerfile # Dockerfile для вашего приложения
├── docker-compose.yml # Конфигурация Docker Compose для мульти-контейнеров
└── .env # Переменные окружения
2. Создание Dockerfile для вашего приложения
Создайте Dockerfile
для контейнера с приложением:
FROM node:18-alpine
# Установим bash, чтобы выполнять необходимые скрипты
RUN apk add --no-cache bash
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем только файлы package*.json для кэширования зависимостей
COPY package*.json ./
# Устанавливаем зависимости
RUN npm install --production
# Копируем весь исходный код
COPY . .
# Генерируем Prisma клиент
RUN npx prisma generate
# Собираем приложение
RUN npm run build
# Открываем порт 3000
EXPOSE 3000
# Копируем скрипт ожидания и даем ему права на выполнение
COPY wait-for-db.sh /app/wait-for-db.sh
RUN chmod +x /app/wait-for-db.sh
# Запуск скрипта ожидания базы данных перед стартом приложения
CMD ["/bin/bash", "/app/wait-for-db.sh"]
3. Создание скрипта ожидания базы данных (wait-for-db.sh)
Для того чтобы ваше приложение подождало, пока база данных станет доступной, создайте файл wait-for-db.sh
в корне проекта:
#!/bin/bash
# Ждем, пока база данных будет доступна на порту 5432
until nc -z -v -w30 db 5432; do
echo "Waiting for database connection..."
sleep 1
done
# Когда база данных доступна, выполняем миграции и запускаем приложение
echo "Database is up, running prisma db push"
npx prisma db push
# Запускаем приложение
npm run start:prod
4. Создание docker-compose.yml
docker-compose.yml
конфигурирует два контейнера: один для вашего приложения и один для базы данных PostgreSQL.
version: '3.7'
services:
db:
image: postgres:latest
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=base_name
ports:
- "5432:5432"
networks:
- base_name_network
app:
build: .
environment:
- DATABASE_URL=postgresql://user:password@db:5432/base_name
depends_on:
- db # Убедимся, что приложение стартует только после базы данных
networks:
- base_name_network
ports:
- "3000:3000"
networks:
planner_network:
driver: bridge
5. Настройка переменных окружения
В файле .env
вашего приложения укажите строку подключения к базе данных:
DATABASE_URL=postgresql://user:password@db:5432/base_name
Важно: Здесь db
— это имя сервиса базы данных, как указано в docker-compose.yml
. Docker Compose автоматически настраивает сетевой доступ между контейнерами, используя имена сервисов.
6. Сборка и запуск контейнеров
Соберите и запустите контейнеры с помощью Docker Compose:
docker-compose up --build -d
Эта команда:
Соберет ваш Docker образ для приложения.
Запустит контейнеры для PostgreSQL и вашего приложения.
Приложение будет ожидать, пока база данных станет доступной, а затем выполнит команду
npx prisma db push
для синхронизации базы данных с моделью Prisma.
После запуска контейнеров вы сможете получить доступ к приложению по адресу:
http://localhost:3000
.
7. Дополнительные шаги
Применение миграций: Если вы используете миграции в Prisma, вам нужно будет выполнять миграции с помощью команды
prisma migrate dev
илиprisma migrate deploy
в процессе разработки или в рамках CI/CD. Это можно сделать вручную или автоматизировать в скриптах.Просмотр логов: Для диагностики проблем с контейнерами используйте команду:
docker logs <container_name_or_id>
Устранение ошибок: Если вы столкнулись с ошибками, проверьте логи контейнеров, выполните команду
docker ps
для проверки состояния контейнеров и убедитесь, что все сервисы работают корректно.
Заключение
Теперь ваше приложение настроено для работы в Docker. С помощью Docker Compose вы можете развернуть и управлять мульти-контейнерным приложением с PostgreSQL и Prisma. Важно использовать скрипт ожидания базы данных, чтобы убедиться, что Prisma выполняет миграции только после того, как база данных готова.
Эта инструкция обеспечит стабильную работу вашего приложения и поможет легко развернуть его в контейнерах для тестирования или продакшн-среды.