首页 > 解决方案 > Sequelize.authenticate() 对 Docker 内的谷歌云 sql 连接不起作用(没有成功或错误响应)

问题描述

我正在使用 typescript、express 和Sequelize.

这是我的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 内部工作,我错过的任何配置?

谢谢

标签: node.jsgoogle-cloud-platformdocker-composesequelize.jsgoogle-cloud-sql

解决方案


您可以尝试 node:10 版本 我也有同样的问题,但是当将图像更改为 node:10 时,该问题就消失了 希望对您有所帮助


推荐阅读