[英]Node.js connect to MySQL Docker container ECONNREFUSED
在您將此問題標記為重復之前,請注意我確實閱讀了其他答案,但這並沒有解決我的問題。
我有一個Docker撰寫文件,包含兩個服務:
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"]
/網絡/ 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" ]
在docker-compose up --build
之后docker-compose up --build
構建服務啟動,但是等待mySQL啟動時“wait-for-it.sh”腳本超時(所以暫時我在測試數據庫連接時沒有使用它,我只是等待直到控制台顯示MySQL已准備好接受傳入連接)
當MySQL從主機運行時,我可以使用Sequel Pro登錄並查詢數據庫並從./mysql/migrations
獲取樣本記錄
我也可以通過SSH連接到正在運行的MySQL容器並執行相同操作。
但是,我的Node.js應用程序在連接時會產生ECONNREFUSED 127.0.0.1:3307
MySQL初始化:
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查詢:
import { db } from '../db/client'
export let get = () => {
return db.query('SELECT * FROM users', [])
.then((results) => {
return results
})
.catch((e) => {
return Promise.reject(e)
})
}
擊中網址時調用的路由/
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
});
});
它不太可能是競爭條件,因為在Node.js失敗的同時,我可以使用Sequel Pro或SSH查詢正在運行的Docker容器和查詢。 所以這可能是Node.js無法訪問MySQL容器的情況?
{
error: connect ECONNREFUSED 127.0.0.1:3307
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 3307,
fatal: true
}
這個:
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"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.