suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Node.js stellt eine Verbindung zum MySQL-Docker-Container ECONNREFUSED her

Bevor Sie diese Frage als Duplikat markieren, beachten Sie bitte, dass ich die andere Antwort gelesen habe und sie mein Problem nicht gelöst hat.

Ich habe eine Docker-Compose-Datei, die zwei Dienste enthält:

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" ]

Nachdem docker-compose up --build der Dienst gestartet wurde, aber das Skript „wait-for-it.sh“ beim Warten auf den Start der mySQL-Verbindung (daher verwende ich es vorerst nicht beim Testen der Datenbank) abläuft, warte ich einfach, bis die Die Konsole zeigt an, dass MySQL bereit ist, die eingehende Verbindung zu akzeptieren

Wenn MySQL auf dem Host ausgeführt wird, kann ich mich mit Sequel Pro anmelden, die Datenbank abfragen und Beispieldatensätze von

./mysql/migrations abrufen


Ich kann auch eine SSH-Verbindung zum laufenden MySQL-Container herstellen und den gleichen Vorgang ausführen.

Meine Node.js-App generiert jedoch beim Herstellen einer Verbindung

ECONNREFUSED 127.0.0.1:3307

MySQL-Initialisierung:

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

Die Route, die aufgerufen wird, wenn auf die URL geklickt wird /

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 es sich hierbei um eine Race-Bedingung handelt, da ich gleichzeitig mit dem Ausfall von Node.js den laufenden Docker-Container mit Sequel Pro oder SSH abfragen und abfragen kann. Könnte es also sein, dass Node.js nicht auf den MySQL-Container zugreifen kann?

{
    error: connect ECONNREFUSED 127.0.0.1:3307
    code: 'ECONNREFUSED',
    errno: 'ECONNREFUSED',
    syscall: 'connect',
    address: '127.0.0.1',
    port: 3307,
    fatal: true
}


P粉296080076P粉296080076310 Tage vor637

Antworte allen(1)Ich werde antworten

  • P粉399090746

    P粉3990907462024-01-22 12:20:58

    这个:

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

    表示Docker会将主机的3307端口映射到容器的3306端口。因此您可以从 Sequel 访问 localhost:3307。

    但是,这并不意味着容器正在监听3307;事实上容器仍在监听 3306。当其他容器尝试访问 mysql DNS 时,它会被转换为内部容器 IP,因此您必须连接到 3306

    所以你的节点配置应该如下所示:

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

    这在你的 docker-compose.yml 中:

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

    注意:wait-for-it.sh 脚本来自: https://github.com/vishnubob/wait-for-it

    Antwort
    0
  • StornierenAntwort