节点服务器无法通过 Docker 连接到 Postgres,使用 TypeORM

Posted

技术标签:

【中文标题】节点服务器无法通过 Docker 连接到 Postgres,使用 TypeORM【英文标题】:Node server cannot connect to Postgres through Docker, using TypeORM 【发布时间】:2021-11-25 00:28:35 【问题描述】:

我目前正在使用 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"
  

最后,这是我的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 中运行所有这些。

提前致谢。

【问题讨论】:

【参考方案1】:

您似乎正试图在您的主机操作系统上运行 migrate 命令,它不知道名为 postgres 的主机。

您将需要run the migrate command within the app container(位于具有名为postgres 的主机的虚拟网络中):

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

【讨论】:

漂亮(但令人尴尬)的简单。去展示我在这些事情上仍然是一个新手。开箱即用,就像一个魅力!谢谢!

以上是关于节点服务器无法通过 Docker 连接到 Postgres,使用 TypeORM的主要内容,如果未能解决你的问题,请参考以下文章

无法从节点连接到 docker 中的 mongo 副本集

Traefik无法通过docker-compose连接到服务器。

带docker的Mysql:无法通过socket连接到本地MySQL服务器

无法连接到 Docker 内的 MySQL 服务器

在 Docker 中安装 MySQL 失败并显示错误消息“无法通过套接字连接到本地 MySQL 服务器”

在 Docker 中安装 MySQL 失败并显示错误消息“无法通过套接字连接到本地 MySQL 服务器”