Ошибка `PrismaClientInitializationError`, связанная с недоступностью сервера базы данных на `localhost:5432`, часто возникает при запуске приложения внутри Docker-контейнера, когда контейнер не может подключиться к базе данных, работающей на локальной машине (или из другого контейнера).
Основные шаги для правильной настройки Docker и устранения этой ошибки:
1. **Использование Docker Network**:
Убедитесь, что ваше приложение и база данных находятся в одной сети Docker. Это позволяет контейнерам общаться друг с другом по именам контейнеров, а не по `localhost`.
2. **Настройка `docker-compose.yml`**:
Если вы используете `docker-compose`, убедитесь, что у вас правильно определены сервисы приложения и базы данных. Пример конфигурации:
```yaml
version: '3.8'
services:
db:
image: postgres:latest
environment:
POSTGRES_USER: example
POSTGRES_PASSWORD: example
POSTGRES_DB: example_db
ports:
- "5432:5432"
app:
build: .
depends_on:
- db
environment:
DATABASE_URL: postgres://example:example@db:5432/example_db
ports:
- "3000:3000"
```
В этом примере экземпляр Postgres имеет имя `db`, и ваше приложение должно использовать это имя в строке подключения, вместо `localhost`.
3. **Изменение строки подключения к базе данных**:
Убедитесь, что в вашем приложении строка подключения к базе данных указывает на контейнер PostgreSQL (`db` в нашем примере), а не на `localhost`.
Например, в вашем файле `.env` должен быть указан следующий параметр:
```env
DATABASE_URL=postgres://example:example@db:5432/example_db
```
4. **Ожидание запуска базы данных**:
Приложение может пытаться подключиться к базе данных до того, как она будет готова. Вы можете использовать такие инструменты, как `wait-for-it` или `dockerize`, чтобы добавить ожидание перед началом вашего приложения. Например:
```Dockerfile
CMD ["wait-for-it", "db:5432", "--", "npm", "start"]
```
5. **Выполнение команды `prisma generate`**:
Убедитесь, что ваша команда `prisma generate` выполняется после успешного подключения к базе данных. Это можно сделать в `Dockerfile` или в вашем `docker-compose.yml`. Ваша команда может выглядеть так:
```yaml
command: ["sh", "-c", "npx prisma migrate deploy && npx prisma generate && npm start"]
```
Убедитесь, что у вас установлен Prisma CLI (например, `npx prisma`) и что команда выполняется только после завершения инициализации базы данных.
Соблюдая данные рекомендации, вы сможете минимизировать вероятность возникновения ошибок при работе с Docker и Prisma.