节点服务器无法通过 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的主要内容,如果未能解决你的问题,请参考以下文章
Traefik无法通过docker-compose连接到服务器。
带docker的Mysql:无法通过socket连接到本地MySQL服务器