Докер MySQL с ошибкой: подключить ECONNREFUSED - PullRequest
2 голосов
/ 22 мая 2019

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

Ошибка: подключить 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
});

база данных / Dockerfile

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

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

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

docker run -d -p 6603:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD=password mysql:5.7
0 голосов
/ 22 мая 2019

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

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

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...