Docker mysql с ошибкой: подключить ECONNREFUSED

Попытка подключить базу данных из микросервиса, не удается подключить базу данных

Ошибка: подключение ECONNREFUSED 172.18.0.2:3306

служба /index.js

var http = require('http');

//create a server object:
http.createServer(function (req, res) {
    res.write('Hello World!'); //write a response to the client
    res.end(); //end the response
}).listen(8080); //the server object listens on port 8080

console.log("Listening at 8080");

var mysql = require('mysql');

var con = mysql.createConnection({
    host: "database",
    user: "root",
    password: "password"
});

con.connect(function(err) {
    if (err) throw err;
    console.log("Database Connected!");
});

докер-compose.yml

version: '3'

services:
  database:
    build:
      ./database
    ports:
      - "6603:3306"
    image: "test-mysql"
    container_name: "test-mysql"

  service:
    build:
      ./service
    ports:
      - "8080:8080"
    depends_on:
      - database
    image: "test-nodejs"
    container_name: "test-nodejs"
    restart: on-failure

Я пытался подключиться к базе данных с другими настройками.

1) Без порта

var con = mysql.createConnection({
    host: "database",
    user: "root",
    password: "password"
});

2) указан порт 3306

var con = mysql.createConnection({
    host: "database",
    user: "root",
    password: "password"
    port: 3306
});

3) указан порт 6603

var con = mysql.createConnection({
    host: "database",
    user: "root",
    password: "password",
    port: 6603
});

база данных/файл Docker

FROM mysql

ENV MYSQL_DATABASE=test
ENV MYSQL_ROOT_PASSWORD=password

EXPOSE 6603:3306

COPY ./schema.sql /docker-entrypoint-initdb.d/

В основном, как мой микросервис node.js может обнаружить службу базы данных?


Редактировать

Я подозревал, что база данных не была готова к моменту запуска nodejs, поэтому я добавил некоторую задержку перед подключением к базе данных, и ошибка изменилась.

Обновленный код

setTimeout(function(){

    var mysql = require('mysql');

    var con = mysql.createConnection({
        host: "database",
        user: "root",
        password: "password"
    });

    con.connect(function(err) {
        if (err) throw err;
        console.log("Database Connected!");
    });

}, 20 * 1000);

выход

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

Пробовали ли вы самостоятельно подключиться к службе MySQL с помощью обычного клиента, такого как dBeaver, после того, как он заработал?

abelito 22.05.2019 13:32

я могу успешно подключиться через mysqlworkbench через 127.0.0.1:3306.

Developer 22.05.2019 13:39

пожалуйста, посмотрите мое редактирование, ошибка изменилась после того, как я добавил некоторую задержку перед подключением.

Developer 22.05.2019 13:43

не нужно тайм-аут, просто закажите отличный код. Посмотрите на мой ответ

Schwarz54 22.05.2019 13:45

и к этому ER_NOT_SUPPORTED_AUTH_MODE у вас это исправить stackoverflow.com/questions/50093144/…

Schwarz54 22.05.2019 13:48

Отличное мышление! Звучит как гораздо более решаемый вопрос сейчас

abelito 22.05.2019 13:50

решается путем деградации базы данных до mysql: 5.7, но это работает только с задержкой, depends_on в моем docker-compose мне не очень помогает. (изменение порядка, как было предложено, также не помогает)

Developer 22.05.2019 13:57

Делюсь своим мнением: поскольку я использую WebStorm, который на самом деле прослушивает все события докера и из журналов, я ясно вижу, что nodejs срабатывает до полной инициализации mysql. так что depends_on не идеально

Developer 22.05.2019 14:02
Получение данных из формы с помощью JavaScript - краткое руководство
Получение данных из формы с помощью JavaScript - краткое руководство
Получить данные из формы с помощью JS очень просто: вы запрашиваете элемент формы, передаете его конструктору new FormData() и, наконец, получаете...
Пользовательские правила валидации в Laravel
Пользовательские правила валидации в Laravel
Если вы хотите создать свое собственное правило валидации, Laravel предоставляет возможность сделать это. Создайте правило с помощью следующей...
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
6
8
3 608
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы пропускаете заказ:

Сначала подключитесь к базе данных, затем прослушайте порт.

var http = require('http');
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "database",
  user: "root",
  password: "password"
 } );

con.connect(function(err) {
  if (err) throw err;
  console.log("Database Connected!");
});

 //create a server object:
 http.createServer(function (req, res) {
 res.write('Hello World!'); //write a response to the client
 res.end(); //end the response
  }).listen(8080); //the server object listens on port 8080

console.log("Listening at 8080");

изменение порядка не решило проблему, я чувствую, что контейнеры mysql и nodejs запускаются одновременно, прежде чем даже mysql будет полностью инициализирован, хотя я указал зависимость для своей службы.

Developer 22.05.2019 13:55

после того, как я понизил свою базу данных до mysql: 5.7, соединение успешно, но работает только после задержки.

Developer 22.05.2019 13:56
Ответ принят как подходящий

Вероятно, вы используете версию MySQL, которая не поддерживает вход в систему, который вы пытаетесь использовать. Попробуйте с mysql v5.7:

docker run -d -p 6603:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD=password mysql:5.7

Да, я понизил версию базы данных, и это сработало, однако мне все еще приходится поддерживать задержку перед подключением, например, 10 секунд, прежде чем я подключаюсь к базе данных, depends_on разве это не полезно, есть идеи?

Developer 22.05.2019 14:02

Только что заметил ваш комментарий к другому посту

Rashomon 22.05.2019 14:03

нет ошибки, теперь он работает после деградации, просто эта задержка с settimeout, прежде чем я подключаюсь к БД, доставляет неудобства.

Developer 22.05.2019 14:09

Убрать задержку и попробовать?

Rashomon 22.05.2019 14:11

Я сделал много приложений с экспрессом и mysql, и мне не нужна была задержка. Скажите, нужна ли вам помощь с этим или вы, наконец, решите это

Rashomon 22.05.2019 17:04

сразу же получаю эту ошибку -> Error: connect ECONNREFUSED 172.18.0.2:3306, вы пробовали подключиться к mysql сразу в стартовом скрипте index.js или подключение происходит при поступлении http запроса? Из интерактивных журналов я наблюдаю, что, пока mysql все еще инициализируется, докер с нетерпением запускает контейнер nodejs.

Developer 23.05.2019 08:25

Я думаю, что эта ситуация упоминается здесь. dev.to/hugodias/wait-for-mongodb-to-start-on-docker-3h8b

Developer 23.05.2019 08:29

Может быть, вы запускаете сервер mysql из Node.js (это вообще возможно?)? Я запускаю сервер mysql вручную, а затем запускаю выполнение Node.js. Не уверен, какую настройку вы используете

Rashomon 23.05.2019 08:30

О да, похоже! Не знаю, как с этим справиться, если честно. У меня нет большого опыта работы с докером. Но я полагаю, что докер должен запустить приложение node, как только база данных каким-то образом заработает.

Rashomon 23.05.2019 08:33

не начиная с nodejs, это ответственность докера. Docker запускает контейнер mysql, а затем переходит к nodejs в правильном направлении, в то время как mysql требуется некоторое время для полной инициализации по сравнению с nodejs, который просто выполняется и пытается создать соединение. весь процесс основан на докере.

Developer 23.05.2019 09:04

вы должны войти в докер, сохраните эту ссылку dev.to/hugodias/wait-for-mongodb-to-start-on-docker-3h8b

Developer 23.05.2019 09:18

Теперь я понимаю, вы правы насчет ответственности докеров. Да, сейчас я начинаю с докера, и я нахожу его замечательным! :)

Rashomon 23.05.2019 09:20

порт базы данных не переводится, так как он находится внутри контейнера. просто используйте 3306 в своем приложении

Другие вопросы по теме