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
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 ??
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese:
Bedeutet, dass Docker wird die Karte
3307
port des Hosts, der die3306
port von der container. So können Sie den Zugriff von Fortsetzung zulocalhost:3307
.Jedoch, es bedeutet nicht, dass der container listenting zu
3307
; der container ist in der Tat noch hören3306
. Wenn andere Behälter versucht, auf diemysql
DNS, es wird übersetzt, um die internen container-IP, daher müssen Sie eine Verbindung zu3306
.So dass Ihre Knoten config sollte so Aussehen:
Und diese in Ihrem docker-Komponieren.yml: