Docker - SequelizeConnectionRefusedError:连接 ECONNREFUSED 127.0.0.1:3306 [英] Docker - SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306

查看:34
本文介绍了Docker - SequelizeConnectionRefusedError:连接 ECONNREFUSED 127.0.0.1:3306的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 docker 容器启动并运行我的 nodejs 应用程序.我不知道可能有什么问题.当我使用控制台调试凭据时,凭据似乎已正确传递.同时启动 sequel pro 并使用相同的用户名和密码直接连接似乎有效.当节点在容器中启动时,我收到错误消息:

I'm trying to get my nodejs application up and running using a docker container. I have no clue what might be wrong. The credentials seems to be passed correctly when I debug the credentials with the console. Also firing up sequel pro and connecting directly with the same username and password seems to work. When node starts in the container I get the error message:

SequelizeConnectionRefusedError:连接ECONNREFUSED 127.0.0.1:3306

SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306

应用程序本身在端口 3000 上正确加载,但是没有从数据库中检索到数据.如果还尝试将环境变量直接添加到 docker compose 文件中,但这似乎也不起作用.

The application itself is loading correctly on port 3000, however no data is retrieved from the database. If have also tried adding the environment variables directly to the docker compose file, but this also doesn't seem to work.

我的项目代码托管在这里:https://github.com/pietheinstrengholt/rssmonster

My project code is hosted over here: https://github.com/pietheinstrengholt/rssmonster

使用如下database.js配置.当我添加 console.log(config) 时,会显示 .env 文件中的正确凭据.

The following database.js configuration is used. When I add console.log(config) the correct credentials from the .env file are displayed.

require('dotenv').load();

const Sequelize = require('sequelize');
const fs = require('fs');
const path = require('path');
const env = process.env.NODE_ENV || 'development';
const config = require(path.join(__dirname + '/../config/config.js'))[env];

if (config.use_env_variable) {
  var sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  var sequelize = new Sequelize(config.database, config.username, config.password, config);
}

module.exports = sequelize;

当我在 database.js 中执行 console.log(config) 时,我得到以下输出:

When I do a console.log(config) inside the database.js I get the following output:

{
username: 'rssmonster',
password: 'password',
database: 'rssmonster',
host: 'localhost',
dialect: 'mysql'
}

遵循.env:

DB_HOSTNAME=localhost
DB_PORT=3306
DB_DATABASE=rssmonster
DB_USERNAME=rssmonster
DB_PASSWORD=password

以及以下 docker-compose.yml:

And the following docker-compose.yml:

version: '2.3'
services:

  app:
    depends_on:
      mysql:
        condition: service_healthy
    build:
      context: ./
      dockerfile: app.dockerfile
    image: rssmonster/app
    ports:
      - 3000:3000
    environment:
      NODE_ENV: development
      PORT: 3000
      DB_USERNAME: rssmonster
      DB_PASSWORD: password
      DB_DATABASE: rssmonster
      DB_HOSTNAME: localhost
    working_dir: /usr/local/rssmonster/server
    env_file:
      - ./server/.env
    links:
      - mysql:mysql

  mysql:
    container_name: mysqldb
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: "rssmonster"
      MYSQL_USER: "rssmonster"
      MYSQL_PASSWORD: "password"
    ports:
      - "3307:3306"
    volumes:
      - /var/lib/mysql
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      timeout: 5s
      retries: 10

volumes:
  dbdata:

错误输出:

{ SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306
app_1    |     at Promise.tap.then.catch.err (/usr/local/rssmonster/server/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:128:19)
app_1    | From previous event:
app_1    |     at ConnectionManager.connect (/usr/local/rssmonster/server/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:125:13)
app_1    |     at sequelize.runHooks.then (/usr/local/rssmonster/server/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:306:50)
app_1    | From previous event:
app_1    |     at ConnectionManager._connect (/usr/local/rssmonster/server/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:306:8)
app_1    |     at ConnectionManager.getConnection (/usr/local/rssmonster/server/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:247:46)
app_1    |     at Promise.try (/usr/local/rssmonster/server/node_modules/sequelize/lib/sequelize.js:564:34)
app_1    | From previous event:
app_1    |     at Promise.resolve.retryParameters (/usr/local/rssmonster/server/node_modules/sequelize/lib/sequelize.js:464:64)
app_1    |     at /usr/local/rssmonster/server/node_modules/retry-as-promised/index.js:60:21
app_1    |     at new Promise (<anonymous>)

推荐答案

Insteaf of localhost 指向 mysql 这是 nodejs 将解析成的服务名称 (DNS)MySQL 容器:

Insteaf of localhost point to mysql which is the service name (DNS) that nodejs will resolve into the MySQL container:

DB_HOSTNAME: mysql

 {
  ...
  host: 'mysql',
  ...
 }

这篇关于Docker - SequelizeConnectionRefusedError:连接 ECONNREFUSED 127.0.0.1:3306的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆