首页 > 解决方案 > 节点服务器无法通过 Docker 连接到 Postgres,使用 TypeORM

问题描述

我目前正在使用 Postgres 数据库在 Node 中构建一个系统,并且我已经使用 docker-compose 为两者创建了一个容器。通过运行,docker-compose up我设法初始化了所有容器(Node 应用程序、Postgres db 和 PGAdmin)并成功建立了连接。

server      | yarn run v1.22.5
server      | $ ts-node-dev --respawn --ignore-watch node_modules src/index.ts
server      | [INFO] 14:35:39 ts-node-dev ver. 1.1.8 (using ts-node ver. 9.1.1, typescript ver. 4.4.3)
server      | Atempting to connect to database...
server      | SUCCESS: Connection achieved.
server      | Running migrations...
server      |  Running Server on port 3000

但是,当我尝试使用生成迁移时yarn typeorm migration:generate -n [something]出现ENOTFOUND错误。

yarn run v1.22.15
$ node --require ts-node/register ./node_modules/typeorm/cli.js migration:generate -n UserRefac
Error during migration generation:
Error: getaddrinfo ENOTFOUND postgres
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:69:26) {
  errno: -3008,
  code: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'postgres'
}
error Command failed with exit code 1.

这是我的docker-compose文件:

version: '3.7'
services:
  server:
    image: server
    build:
      context: .
      target: build-node
    volumes:
      - ./:/src/app
      - src/app/node_modules
    container_name: server
    ports:
      - 3000:3000
    depends_on:
      - postgres
    entrypoint: ['yarn', 'start']
    networks:
      - servernet

  postgres:
    image: postgres
    environment:
      POSTGRES_PASSWORD: inesc2021
      POSTGRES_USER: inesc
      POSTGRES_DB: db_inesc
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    ports:
      - 5432:5432
    networks:
      - servernet

  pgadmin:
    image: dpage/pgadmin4
    restart: always
    ports:
      - 5050:80
    environment:
      - PGADMIN_DEFAULT_EMAIL=inesc@inesc.pt
      - PGADMIN_DEFAULT_PASSWORD=inesc2021
    depends_on:
      - postgres
    networks:
      - servernet
networks:
  servernet:
    driver: bridge

这是我的Dockerfile

FROM node as build-node

WORKDIR /src/app

COPY . .
RUN ["yarn"]
RUN ["yarn", "build"]
EXPOSE 3000
ENTRYPOINT ["yarn"]

这是我的ormconfig.json

{
  "type": "postgres",
  "host": "postgres",
  "port": 5432,
  "username": "inesc",
  "password": "inesc2021",
  "database": "db_inesc",
  "synchronize": false,
  "logging": false,
  "entities": ["src/classes/**/*.ts"],
  "migrations": ["src/migrations/**/*.ts"],
  "cli": {
    "entitiesDir": "src/classes",
    "migrationsDir": "src/migrations"
  }
}

最后,这是 my package.json,所以你可以看到我是如何定义我的脚本的:

{
  "name": "ihanduapp_v2",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "watch": "tsc -w",
    "dev": "nodemon dist/index.js",
    "start": "ts-node-dev --respawn --ignore-watch node_modules src/index.ts",
    "build": "tsc",
    "start2": "yarn build && node dist/index.js",
    "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/express": "^4.17.13",
    "@types/node": "^16.10.2",
    "@types/swagger-ui-express": "^4.1.3",
    "@typescript-eslint/eslint-plugin": "^4.32.0",
    "@typescript-eslint/parser": "^4.32.0",
    "eslint": "^7.32.0",
    "nodemon": "^2.0.13",
    "prettier": "^2.4.1",
    "ts-node": "^10.2.1",
    "ts-node-dev": "^1.1.8",
    "typescript": "^4.4.3"
  },
  "dependencies": {
    "class-validator": "^0.13.1",
    "dotenv": "^10.0.0",
    "express": "^4.17.1",
    "express-openapi-validator": "^4.13.1",
    "pg": "^8.7.1",
    "reflect-metadata": "^0.1.13",
    "swagger-jsdoc": "^6.1.0",
    "swagger-ui-express": "^4.1.6",
    "typeorm": "^0.2.37"
  }
}

当然,当我更改"host": "postgres"为时"host": "localhost",我可以使用上面提到的 yarn 脚本生成和运行迁移,但我自然会失去容器之间的连接,服务器应用程序无法重试逻辑。

我不知道问题出在哪里,因为我对 docker-compose 和 TypeORM 都是新手,所以任何帮助都会非常受欢迎。

最后一点:我在 MacOS 中运行所有这些。

提前致谢。

标签: node.jstypescriptpostgresqldockertypeorm

解决方案


看起来您正试图在您的主机操作系统上运行 migrate 命令,它不知道名为postgres.

您将需要在应用容器(位于具有名为 的主机的虚拟网络中postgres)中运行 migrate 命令:

docker-compose exec server node --require ts-node/register ./node_modules/typeorm/cli.js migration:generate -n UserRefac

推荐阅读