Heim > Fragen und Antworten > Hauptteil
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
./mysql/migrations
abrufen
Meine Node.js-App generiert jedoch beim Herstellen einer Verbindung
ECONNREFUSED 127.0.0.1:3307
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粉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