node.js - 节点服务器无法通过 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 中运行所有这些。
提前致谢。
解决方案
看起来您正试图在您的主机操作系统上运行 migrate 命令,它不知道名为postgres
.
您将需要在应用容器(位于具有名为 的主机的虚拟网络中postgres
)中运行 migrate 命令:
docker-compose exec server node --require ts-node/register ./node_modules/typeorm/cli.js migration:generate -n UserRefac
推荐阅读
- python - 将本地计算机时钟与 NTP 时间同步
- python - 如何强制 python matplotlib 到轴进行线性缩放?
- javascript - 我想将一些代码从代码笔切换到 Visual Studio 代码
- networking - 计算与链接节点的交互 [netlogo]
- java - 如何判断一个反应是否被使用 JDA 的不和谐机器人删除?
- image-processing - 未考虑 Thumbor focus() 过滤器
- mysql - Mysql 计算 Sum(if()) 中的不同 ID
- c# - 使用 BeginInvoke 触发的事件会引发异常,但如果使用 Invoke 触发则不会
- python - 在python中使用条件删除列表中的数字
- apache-kafka - 将 IBM iSeries 连接到 Kafka