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

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

问题描述

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

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:connect 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

-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 localhost 指向 mysql ,这是nodejs将解析到MySQL容器中的服务名称(DNS):

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天全站免登陆