Sequelize.authenticate() 对 Docker 内的谷歌云 sql 连接不起作用(没有成功或错误响应)
Posted
技术标签:
【中文标题】Sequelize.authenticate() 对 Docker 内的谷歌云 sql 连接不起作用(没有成功或错误响应)【英文标题】:Sequelize.authenticate() do not working (no success or error response) for google cloud sql connection inside Docker 【发布时间】:2020-08-23 02:33:53 【问题描述】:我正在使用 typescript 、express 和 Sequelize
构建 api 服务器。
这是我的database
连接类。
export class Database
private _sequelize: Sequelize;
private config: DBConfigGroup = dbConfig;
private env = process.env.NODE_ENV as string;
constructor()
this._sequelize = new Sequelize(
dialect: 'postgres',
database: this.config[this.env].database,
username: this.config[this.env].username,
password: this.config[this.env].password,
host: this.config[this.env].host,
);
async connect(): Promise<void>
try
console.log('start connect');
await this._sequelize.authenticate();
console.log('Connection has been established successfully.'.green.bold);
catch (error)
console.error('Unable to connect to the database:'.red.bold, error);
async close(): Promise<void>
try
await this._sequelize.close();
console.log('Connection has been close successfully.'.red.bold);
catch (error)
console.error('Unable to close to the database:'.yellow.bold, error);
get sequelize(): Sequelize
return this._sequelize;
所以在我的server.ts
中,我正在调用它
dotenv.config(
path: './config/environments/config.env',
);
const database = new Database();
console.log('Init db');
database
.connect()
.then(() =>
console.log('success db ininit');
)
.catch((err) =>
console.log('fail db init: ', err);
);
/**
* Server Activation
*/
const server = app.listen(PORT, () =>
console.log(`Server running in $process.env.NODE_ENV mode on port $PORT`.yellow.bold);
);
所以在我的本地开发中一切正常
但是当我尝试使用 docker compose
使用此配置运行它时
// docker-compose.yml
version: '3.4'
services:
api:
stdin_open: true
tty: true
build:
context: ./api
dockerfile: Dockerfile.dev
ports:
- "5000:5000"
volumes:
- /app/node_modules
- ./api:/app
这是我的Dockerfile.dev
文件
FROM node:alpine
ENV NODE_ENV=development
WORKDIR /app
EXPOSE 5000
COPY package.json package-lock.json* ./
RUN npm install && npm cache clean --force
COPY . .
CMD ["npm", "run", "dev:docker"]
但问题是当我运行docker-compose up --build
我只看到这些日志
api_1 | Init db
api_1 | start connect
api_1 | Server running in development mode on port 5000
所以基本上不管sequelize.authenticate()
是成功还是失败都没有回应,
只是Server running in development mode on port 5000
注销,毕竟什么都没有。
为什么它不能像在本地一样在 docker 内部工作,我错过了什么配置?
谢谢
【问题讨论】:
可能您无法从那里访问数据库(不同的网络、错误的 IP/DNS 名称、数据库未在该接口上侦听、防火墙规则等),如果您等待一分钟或者两个,你会因为超时错误而失败。您没有显示 dbConfig - 主机/端口是什么? @CherryDT host 是 google sql 的 ip,port 应该没关系吧?我也可以通过正常的本地主机连接成功连接,我想我应该错过我的 docker 的一些配置。Dockerfile.dev
中有什么内容?
@TarunLalwani 已经在问题中了。
@VarisDarasirikul,对不起,我的意思是要环境变量而不是 Dockerfile
【参考方案1】:
最新节点版本 v14.15.5 现在针对此问题抛出错误。指示本地安装pg
/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:81
throw new Error(`Please install $moduleName package manually`);
^
错误:请手动安装pg包
我这样做并解决了我机器上的问题。
【讨论】:
【参考方案2】:你可以试试node:10版本 我有同样的问题,但是当将图像更改为节点:10 时,该问题就消失了 希望能帮到你
【讨论】:
这很奇怪,但我做了同样的事情并且它开始工作了。你知道这背后的原因吗? @Amolpskamble 我认为 Sequelize 和 Node 版本冲突 有同样的问题,确实指定另一个版本的节点是解决方案。我的是node:alpine
更改为 node:13.12.0-alpine3.10
天哪,谢谢。我有同样的问题,并认为我要疯了。知道罪魁祸首,我发现了一个issue on sequelize's GitHub. 冲突是由于一个过时的 pg 依赖关系由于节点中未记录的更改而中断 - more explanation and references here - 如果你将 pg 升级到 8.0.3 你不需要降级 node
我在节点版本 14 上,在 mac 上遇到了完全相同的问题。降级到 12.6.0 就可以了以上是关于Sequelize.authenticate() 对 Docker 内的谷歌云 sql 连接不起作用(没有成功或错误响应)的主要内容,如果未能解决你的问题,请参考以下文章