Nodejs 应用程序无法与 postgresql (docker-compose) 通信

问题描述 投票:0回答:1

我正在尝试创建一个 docker-compose 文件来连接在 nodejs 中创建的后端,使用 typeORM 来操作和连接 postgresql 数据库,但总是出现错误。它在单独的容器中工作,但是当我尝试使用 docker-compose 中的服务名称连接 typeORM 时,总是返回 connect ECONNREFUSED。我正在使用 docker compose 2.24.6 和 docker 26.0.0。

nodejs

Dockerfile

FROM node:alpine
WORKDIR /usr/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD npm start

打字

data-source.ts

export const AppDataSource = new DataSource({
    type: "postgres",
    host: "db",
    port: 5432,
    username: "admin",
    password: "mysecretpassword",
    database: "taskmanagerdb",
    synchronize: true,
    logging: false,
    entities: [User, Task, Category],
    migrations: [],
    subscribers: [],
})

docker-compose.yml

services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=taskmanagerdb
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=mysecretpassword
    ports:
      - "5432:5432"
  server:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      - PGHOST=db

记录错误

 ✔ 
[+] Running 3/3
 ✔ Network myproject_default     Created                                                         0.0s 
 ✔ Container myproject-db-1      Created                                                         0.0s 
 ✔ Container myproject-server-1  Created                                                         0.0s 
Attaching to db-1, server-1
db-1      | 
db-1      | PostgreSQL Database directory appears to contain a database; Skipping initialization
db-1      | 
db-1      | 2024-03-30 00:39:29.465 UTC [1] LOG:  starting PostgreSQL 16.2 (Debian 16.2-1.pgdg120+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
db-1      | 2024-03-30 00:39:29.465 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db-1      | 2024-03-30 00:39:29.465 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db-1      | 2024-03-30 00:39:29.476 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db-1      | 2024-03-30 00:39:29.489 UTC [29] LOG:  database system was shut down at 2024-03-30 00:39:17 UTC
db-1      | 2024-03-30 00:39:29.497 UTC [1] LOG:  database system is ready to accept connections
server-1  | 
server-1  | > [email protected] start
server-1  | > ts-node src/main.ts
server-1  | 
server-1  | Error: connect ECONNREFUSED 127.0.0.1:5432
server-1  |     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1605:16) {
server-1  |   errno: -111,
server-1  |   code: 'ECONNREFUSED',
server-1  |   syscall: 'connect',
server-1  |   address: '127.0.0.1',
server-1  |   port: 5432
server-1  | }
server-1 exited with code 0

package.json

{
   "name": "TaskManager",
   "version": "0.0.1",
   "description": "Awesome project developed with TypeORM.",
   "devDependencies": {
      "@types/express": "^4.17.21",
      "@types/node": "^16.11.10",
      "ts-node": "10.9.1",
      "typescript": "4.5.2"
   },
   "dependencies": {
      "class-transformer": "^0.5.1",
      "class-validator": "^0.14.1",
      "express": "^4.19.2",
      "pg": "^8.4.0",
      "reflect-metadata": "^0.1.13",
      "typeorm": "0.3.20"
   },
   "scripts": {
      "start": "ts-node src/main.ts",
      "typeorm": "typeorm-ts-node-commonjs"
   }
}

node.js postgresql docker docker-compose typeorm
1个回答
0
投票

假设你的项目是这样的:

├── docker-compose.yml
├── Dockerfile
├── ormconfig.json
├── package.json
├── package-lock.json
├── src
│   └── main.ts
└── tsconfig.json

🗎

docker-compose.yml

version: "3.8"

services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=taskmanagerdb
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=mysecretpassword
    ports:
      - "5432:5432"
    logging:
      driver: "none"

  server:
    container_name: server
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      - PGHOST=db

🗎

Dockerfile

FROM node:alpine

COPY package*.json ./
RUN npm install

COPY . .

CMD npm start

🗎

ormconfig.json

{
    "type": "postgres",
    "host": "db",
    "port": 5432,
    "username": "admin",
    "password": "mysecretpassword",
    "database": "taskmanagerdb",
    "synchronize": true,
    "logging": false
  }

🗎

package.json

{
    "name": "TaskManager",
    "version": "0.0.1",
    "description": "Awesome project developed with TypeORM.",
    "devDependencies": {
        "@types/express": "^4.17.21",
        "@types/node": "^16.18.93",
        "ts-node": "^10.9.2",
        "typescript": "^4.9.5"
    },
    "dependencies": {
        "class-transformer": "^0.5.1",
        "class-validator": "^0.14.1",
        "express": "^4.19.2",
        "pg": "^8.11.3",
        "reflect-metadata": "^0.1.14",
        "typeorm": "^0.3.20"
    },
    "scripts": {
        "start": "ts-node src/main.ts",
        "typeorm": "typeorm-ts-node-commonjs"
    }
}

🗎

src/main.ts
(连接到数据库并执行简单查询的脚本。)

import "reflect-metadata";
import {createConnection} from "typeorm";

console.log("Connecting to DB...");

createConnection().then(async connection => {
    console.log("Done!");

    const simpleQueryResult = await connection.query('SELECT 1;');
    console.log('Simple query result:', simpleQueryResult);

    const tablesQueryResult = await connection.query('SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname=\'public\';');
    console.log('Tables in public schema:', tablesQueryResult);

}).catch(error => console.log(error));

© www.soinside.com 2019 - 2024. All rights reserved.