Задать вопрос
zenithxxl
@zenithxxl
Веб-разработчик

Как связать Docker Nest.js Prisma PostgreSQL?

У меня есть docker-compse.yaml:
services:
  postgres:
    image: postgres:alpine
    env_file: ./backend/.env
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 123456
      POSTGRES_DB: mydb
    restart: always
    ports:
      - '5432:5432'
    networks:
      - kinonetwork
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: pg_isready -d mydb
      interval: 10s
      timeout: 5s
      start_period: 10s
      retries: 5
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    env_file:
      - ./backend/.env
    ports:
      - '4200:4200'
    networks:
      - kinonetwork
    depends_on:
      postgres:
        condition: service_healthy

networks:
  kinonetwork:
    driver: bridge
volumes:
  pgdata:

Dockerfile:
# Build stage
FROM node:22.2.0 as build

WORKDIR /app

COPY package*.json yarn.lock ./

RUN yarn install --frozen-lockfile
COPY . .

RUN yarn prisma generate
RUN yarn prisma db push

RUN yarn build

# Production stage
FROM node:22.2.0

WORKDIR /app

COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/package*.json ./
COPY --from=build /app/dist ./dist

EXPOSE 4200

CMD [ "yarn", "start:prod" ]

В env файле:
POSTGRES_PASSWORD="123456"
POSTGRES_USER="postgres"
POSTGRES_DB="mydb"
POSTGRES_HOST="postgres"
POSTGRES_PORT="5432"

DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}?schema=public"


Ошибка:
docker-compose up -d --build
[+] Building 1.5s (11/15) docker:desktop-linux
=> [backend internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 506B 0.0s
=> WARN: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 2) 0.0s
=> [backend internal] load metadata for docker.io/library/node:22.2.0 0.5s
=> [backend internal] load .dockerignore 0.0s
=> => transferring context: 106B 0.0s
=> [backend build 1/8] FROM docker.io/library/node:22.2.0@sha256:a8ba58f54e770a0f910ec36d25f8a4f1670e741a58c2e6358b2c30b575c84263 0.0s
=> => resolve docker.io/library/node:22.2.0@sha256:a8ba58f54e770a0f910ec36d25f8a4f1670e741a58c2e6358b2c30b575c84263 0.0s
=> [backend internal] load build context 0.0s
=> => transferring context: 14.39kB 0.0s
=> CACHED [backend build 2/8] WORKDIR /app 0.0s
=> CACHED [backend build 3/8] COPY package*.json yarn.lock ./ 0.0s
=> CACHED [backend build 4/8] RUN yarn install --frozen-lockfile 0.0s
=> CACHED [backend build 5/8] COPY . . 0.0s
=> CACHED [backend build 6/8] RUN yarn prisma generate 0.0s
=> ERROR [backend build 7/8] RUN yarn prisma db push 0.8s
------
> [backend build 7/8] RUN yarn prisma db push:
0.317 yarn run v1.22.19
0.335 $ /app/node_modules/.bin/prisma db push
0.734 Environment variables loaded from .env
0.734 Prisma schema loaded from prisma/schema.prisma
0.737 Datasource "db": PostgreSQL database "mydb", schema "public" at "localhost:5432"
0.772
0.772 Error: P1001: Can't reach database server at `localhost`:`5432`
0.772
0.772 Please make sure your database server is running at `localhost`:`5432`.
0.787 error Command failed with exit code 1.
0.787 info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
------
time="2025-01-08T17:13:26+03:00" level=warning msg="current commit information was not captured by the build" error="failed to read current commit information with git rev-parse --is-inside-work-tree"
failed to solve: process "/bin/sh -c yarn prisma db push" did not complete successfully: exit code: 1


База данных и Nest.js в нативном режиме работают, а с Docker-ом нет, но когда я пытаюсь подключится к бд во время билда Nest.js, не подключается
  • Вопрос задан
  • 90 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
@shushara4241
В docker-compose нет конфигурации сети. Возможно сеть использует не драйвер bridge. Добавь в конце docker-compose.yml явно, что-то подобное:
networks:
  kinonetwork:
    driver: bridge


yarn build возникает раньше, чем запускается бд

Для таких случаев в docker compose есть healthcheck-и и condition-ы. Пример:
version: '3.8'

services:
  postgres:
    image: postgres:latest
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 123456
      POSTGRES_DB: mydb
    restart: always
    ports:
      - '5432:5432'
    networks:
      - kinonetwork
   healthcheck:
      test: pg_isready -d mydb
      interval: 10s
      timeout: 5s
      start_period: 10s
      retries: 5

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    env_file:
      - ./backend/.env
    ports:
      - '4200:4200'
    networks:
      - kinonetwork
    depends_on:
      postgres:
         condition: service_healthy

Кроме того желательно проверить работает ли вообще сервис postgres. Возможно в этом проблема

Кроме того возможно соединение по url вообще не поддерживается, первый поисковый запрос предлагает установить @nestjs/typeorm для соединения с бд
Ответ написан
SignFinder
@SignFinder
Wintel\Unix Engineer\DevOps
Можно перенести yarn prisma db push и yarn prisma generate в Entrypoint контейнера node.js и запускать их перед стартом приложения.
Но вообще это "yarn build возникает раньше, чем запускается бд" врядли. У вас же есть
depends_on:
- postgres
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы