Docker - SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306 - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь запустить приложение nodejs с помощью контейнера Docker.Я понятия не имею, что может быть не так.Кажется, учетные данные передаются правильно, когда я отлаживаю их с помощью консоли.Также работает запуск sequel pro и подключение напрямую с тем же именем пользователя и паролем.Когда узел запускается в контейнере, я получаю сообщение об ошибке:

SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306

Само приложение корректно загружается на порт 3000, однакоданные не извлекаются из базы данных.Если вы также пытались добавить переменные среды непосредственно в файл компоновки Docker, но это также, похоже, не работает.

Мой код проекта находится здесь: https://github.com/pietheinstrengholt/rssmonster

Следующееиспользуется конфигурация database.js.Когда я добавляю console.log (config), отображаются правильные учетные данные из файла .env.

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;

Когда я выполняю console.log (config) внутри database.js, я получаю следующий вывод:

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

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>)

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Внутри контейнера вы должны ссылаться на контейнер по имени, которое вы указали в файле docker-compose.yml.

В этом случае вы должны использовать

DB_HOSTNAME: mysql
0 голосов
/ 31 декабря 2018

Insteaf из localhost указывает на mysql, которое является именем службы (DNS), которое nodejs будет преобразовывать в контейнер MySQL:

DB_HOSTNAME: mysql

И

 {
  ...
  host: 'mysql',
  ...
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...