Сборка приложения NestJS с докером не может получить доступ к базе данных postgres в той же сети докеров: ECONNREFUSED 127.0.0.1:5432

Я хочу запустить свое приложение на своем локальном компьютере в Docker. Я не хочу сейчас оптимизировать размер своего докер-приложения или создавать его для производства.

Docker успешно создает мое приложение backend-api и postgres-db. Но я могу получить доступ к базе данных docker postgres только за пределами моего докера, например. с установленным на моем компьютере dbeaver. Кроме того, если я запускаю свое приложение backend-api БЕЗ Docker с помощью «npm run start», мое приложение также может получить доступ к базе данных без каких-либо ошибок и также может записывать в posgres db. Только когда я создаю backend-api с помощью Docker и запускаю приложение внутри Docker, я получаю эту ошибку. Поскольку это происходит только в Docker, я предполагаю, что в моем Dockerfile отсутствует что-то важное.

Мой докер-compose.yml:

version: '3'

services:

  backend:
    build: .
    container_name: backend-api
    command: npm run start
    restart: unless-stopped
    ports:
      - 3000:3000
    volumes:
      - .:/usr/src/backend
    networks:
      - docker-network
    depends_on:
      - database

  database:
    image: postgres:latest
    container_name: backend-db
    ports:
      - 5432:5432
    volumes:
      - postgresdb/:/var/lib/postgresql/data/
    networks:
      - docker-network
    environment:
      POSTGRES_USER: devuser
      POSTGRES_PASSWORD: devpw
      POSTGRES_DB: devdb

volumes:
  postgresdb:

networks:
  docker-network:
    driver: bridge

Мой Докерфайл:

FROM node:16.15.0-alpine

WORKDIR /usr/src/backend

COPY . .

RUN npm install

Выход sudo docker-compose up --build:

Starting backend-db ... done
Recreating backend-api ... done
Attaching to backend-db, backend-api
backend-db  | 
backend-db  | PostgreSQL Database directory appears to contain a database; Skipping initialization
backend-db  | 
backend-db  | 2022-05-03 20:35:46.065 UTC [1] LOG:  starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
backend-db  | 2022-05-03 20:35:46.066 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
backend-db  | 2022-05-03 20:35:46.066 UTC [1] LOG:  listening on IPv6 address "::", port 5432
backend-db  | 2022-05-03 20:35:46.067 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
backend-db  | 2022-05-03 20:35:46.071 UTC [26] LOG:  database system was shut down at 2022-05-03 20:35:02 UTC
backend-db  | 2022-05-03 20:35:46.077 UTC [1] LOG:  database system is ready to accept connections
backend-api | 
backend-api | > [email protected] start
backend-api | > nodemon
backend-api | 
backend-api | [nodemon] 2.0.15
backend-api | [nodemon] to restart at any time, enter `rs`
backend-api | [nodemon] watching path(s): src/**/*
backend-api | [nodemon] watching extensions: ts
backend-api | [nodemon] starting `IS_TS_NODE=true ts-node -r tsconfig-paths/register src/main.ts`
backend-api | [Nest] 30  - 05/03/2022, 8:35:50 PM     LOG [NestFactory] Starting Nest application...
backend-api | [Nest] 30  - 05/03/2022, 8:35:50 PM     LOG [InstanceLoader] TypeOrmModule dependencies initialized +73ms
backend-api | [Nest] 30  - 05/03/2022, 8:35:50 PM     LOG [InstanceLoader] ConfigHostModule dependencies initialized +1ms
backend-api | [Nest] 30  - 05/03/2022, 8:35:50 PM     LOG [InstanceLoader] AppModule dependencies initialized +0ms
backend-api | [Nest] 30  - 05/03/2022, 8:35:50 PM     LOG [InstanceLoader] ConfigModule dependencies initialized +1ms
backend-api | [Nest] 30  - 05/03/2022, 8:35:50 PM   ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
backend-api | Error: connect ECONNREFUSED 127.0.0.1:5432
backend-api |     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1187:16)
backend-api | [Nest] 30  - 05/03/2022, 8:35:53 PM   ERROR [TypeOrmModule] Unable to connect to the database. Retrying (2)...

Мой ormconfig.ts:

import { ConnectionOptions } from 'typeorm';

const config: ConnectionOptions = {
  type: 'postgres',
  host: 'localhost',
  port: 5432,
  username: 'devuser',
  password: 'devpw',
  database: 'devdb',
  entities: [__dirname + '/**/*.entity{.ts,.js}'],
  synchronize: false,
  migrations: [__dirname + '/**/migrations/**/*{.ts,.js}'],
  cli: {
    migrationsDir: 'src/migrations',
  },
};

export default config;

Пожалуйста, дайте мне знать, какую еще информацию вы хотели бы, чтобы я предоставил. Я новичок в мире Docker.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы запускаете док-контейнер localhost, вы получаете container's локальный хост, а не ваш компьютер, поэтому этот хост не подходит для использования. Когда вы используете docker-compose, автоматически создается сеть докеров с использованием имен служб как hosts. Таким образом, вместо использования localhost для хоста базы данных вы можете использовать database в качестве хоста, и теперь сеть докеров будет правильно направлять запрос в службу database, как определено в вашем файле docker-compose.yml.

Другие вопросы по теме