Docker Compose连接ECONNREFUSED 172.18.0.4:3306

时间:2018-07-22 05:04:01

标签: mysql docker docker-compose sequelize.js

当我使用以下命令构建项目的容器时:

sudo docker build -t PROJECT_NAME .

然后我通过此Docker-Compose配置下载mysql的映像:

  db:
    image: mysql
    restart: always
    ports:
      - "8999:3306"
    networks:
      - webnet
    environment:
      MYSQL_DATABASE: slack
      MYSQL_ROOT_PASSWORD: admin

然后,该项目将通过Sequelize ORM

与MySQL连接

我遇到此错误:

Unhandled rejection SequelizeConnectionRefusedError: connect ECONNREFUSED 172.18.0.4:3306

enter image description here

我该如何解决?

Sequelize配置是这样的:

const sequelize = new Sequelize(process.env.TEST_DB || 'slack', 'root', 'admin', {
  host: process.env.DB_HOST || 'localhost',
  operatorsAliases: Sequelize.Op,
  dialect: 'mysql',
  define: {
    underscored: true
  }
});

网络的配置是这样的:

web:
    image: slack-clone-server
    ports:
      - "8080:8080"
    networks:
      - webnet
    environment:
      DB_HOST: db
      REDIS_HOST: redis
    command: ["./wait-for-it.sh", "db:3306", "--", "npm", "run", "prod"]

名为“等待它”的脚本是this

如果某人需要完整的代码,请按以下步骤操作:

Sequelize config

Docker Compose config

Dockerfile config

4 个答案:

答案 0 :(得分:1)

默认情况下,

wait-for-it.sh等待15 seconds并返回,即使目标尚未准备好也是如此。您也可以在输出中看到这一点。但是数据库尚未准备好。使wait-for-it.sh wait longer,也许让-t 90等待90秒,或者使-t 0使其永远等待。

(以我的经验,Docker数据库容器通常需要30-60秒才能启动,尤其是第一次启动。)

答案 1 :(得分:1)

David已经说过数据库目前还没有准备好。您也可以在docker-compose文件中使用 depends_on 。这将首先启动并初始化数据库,然后启动“ Web”容器。

services:
  web:
    ...
    depends_on:
      - db

  db:
    image: mariadb:latest
    ...

答案 2 :(得分:0)

db:
    container_name: mysqldb //or whatever you want <<Add This
    image: mysql
    restart: always
    ports:
      - "8999:3306"
    networks:
      - webnet
    environment:
      MYSQL_DATABASE: slack
      MYSQL_ROOT_PASSWORD: admin

然后将process.env.DB_HOST的值分配给 Mysql容器名称

像:process.env.DB_HOST=mysqldb

答案 3 :(得分:0)

将process.env.DB_HOST的值分配给Mysql容器名称

例如:process.env.DB_HOST = mysqldb

相关问题