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 连接不起作用(没有成功或错误响应)的主要内容,如果未能解决你的问题,请参考以下文章

我可以等待1等待的2个异步操作吗?