Sonntag, Mai 31, 2020

Node.js Verbindung zu MySQL Docker-container ECONNREFUSED

Bevor Sie Flagge diese Frage als Duplikat, bitte beachten Sie, dass ich habe gelesen, dass andere Antworten, aber es hat nicht mein problem zu lösen.

Habe ich ein Docker compose-Datei, bestehend aus zwei Dienstleistungen:

version: "3"
services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_HOST: localhost
      MYSQL_DATABASE: mydb
      MYSQL_USER: mysql
      MYSQL_PASSWORD: 1234
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3307:3306"
    expose:
      - 3307
    volumes:
      - /var/lib/mysql
      - ./mysql/migrations:/docker-entrypoint-initdb.d
    restart: unless-stopped
  web:
    build:
      context: .
      dockerfile: web/Dockerfile
    volumes:
      - ./:/web
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: development
      PORT: 3000
    links:
      - mysql:mysql
    depends_on:
      - mysql
    expose:
      - 3000
    command: ["./wait-for-it.sh", "mysql:3307"]

/web/Dockerfile:

FROM node:6.11.1

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
RUN npm install

COPY . /usr/src/app

CMD [ "npm", "start" ]

Nach docker-compose up --build die Dienste starten, aber die „wait-for-it.sh“ script Timeout beim warten auf mySQL zu starten (also vorübergehend bin ich nicht, es zu benutzen, wenn Tests für DB-verbindungen, ich warte einfach bis die Konsole zeigt, dass MySQL bereit für die Annahme von eingehenden verbindungen)

Wenn MySQL läuft von der host-Maschine, kann ich loggen Sie sich mit Sequel Pro und Abfrage der DB und Holen Sie sich die Beispiel-Datensätze aus ./mysql/migrations

Node.js Verbindung zu MySQL Docker-container ECONNREFUSED
Node.js Verbindung zu MySQL Docker-container ECONNREFUSED

Kann ich auch SSH in den Laufenden MySQL-container und das gleiche tun.

Allerdings, mein Node.js app-Erträge ECONNREFUSED 127.0.0.1:3307 beim Anschluss

MySQL-init:

import * as mysql from 'promise-mysql'

const config = {
    host: 'localhost',
    database: 'mydb',
    port: '3307',
    user: 'mysql',
    password: '1234',
    connectionLimit: 10
}

export let db = mysql.createPool(config);

MySQL-Abfrage:

import { db } from '../db/client'

export let get = () => {

return db.query('SELECT * FROM users', [])
    .then((results) => {
        return results

    })
    .catch((e) => {
        return Promise.reject(e)
    })
}

Route aufgerufen wird, wenn man die url /

import { Router } from 'express';
import * as repository from '../repository'
export let router = Router();

router.get('/', async (req, res) => {

    let users;

    try{
        users = await repository.users.get();
    } catch(e){
        //ECONNREFUSED 127.0.0.1:3307
    }

    res.render('index', {
        users: users
    });
});

Es ist unwahrscheinlich, dass eine race condition zu sein, weil zur gleichen Zeit, wenn Node.js schlägt fehl, ich kann die Abfrage mit Sequel Pro oder SSH in das laufende Docker-container und-Abfrage. Also ist es wohl ein Fall von Node.js nicht in der Lage, Zugriff auf die MySQL-container?

{
    error: connect ECONNREFUSED 127.0.0.1:3307
    code: 'ECONNREFUSED',
    errno: 'ECONNREFUSED',
    syscall: 'connect',
    address: '127.0.0.1',
    port: 3307,
    fatal: true
}
  • Versuchen Sie Ihre lokale ip – z.B. 192.168.0.8
  • Dies würde die Arbeit nicht in einer Produktionsumgebung, da meine lokale host-Maschine wäre nicht herum. Andockfenster sollte link den Containern.
  • Gibt es einen Datenbank-server innerhalb des „nodejs“ Andockfenster ??
InformationsquelleAutor ChrisRich | 2017-07-30

1 Kommentar

  1. 10

    Diese:

    mysql:
        image: mysql:5.7
        environment:
        ...
        ports:
          - "3307:3306"

    Bedeutet, dass Docker wird die Karte 3307 port des Hosts, der die 3306 port von der container. So können Sie den Zugriff von Fortsetzung zu localhost:3307.

    Jedoch, es bedeutet nicht, dass der container listenting zu 3307; der container ist in der Tat noch hören 3306. Wenn andere Behälter versucht, auf die mysql DNS, es wird übersetzt, um die internen container-IP, daher müssen Sie eine Verbindung zu 3306.

    So dass Ihre Knoten config sollte so Aussehen:

    const config = {
        host: 'mysql',
        database: 'mydb',
        port: '3306',
        user: 'mysql',
        password: '1234',
        connectionLimit: 10
    }

    Und diese in Ihrem docker-Komponieren.yml:

    command: ["./wait-for-it.sh", "mysql:3306"]

Kostenlose Online-Tests