Chr*_*ich 5 mysql node.js docker docker-compose
在您将此问题标记为重复之前,请注意我确实阅读了其他答案,但这并没有解决我的问题.
我有一个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"]
Run Code Online (Sandbox Code Playgroud)
/网络/ 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" ]
Run Code Online (Sandbox Code Playgroud)
后docker-compose up --build服务启动,但是"wait-for-it.sh"等待MySQL的开始(所以暂时DB连接测试时,我不使用它时,脚本超时,我就等到控制台显示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);
Run Code Online (Sandbox Code Playgroud)
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)
})
}
Run Code Online (Sandbox Code Playgroud)
击中网址时调用的路由/
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
});
});
Run Code Online (Sandbox Code Playgroud)
它不太可能是竞争条件,因为在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
}
Run Code Online (Sandbox Code Playgroud)
Rob*_*ert 10
这个:
mysql:
image: mysql:5.7
environment:
...
ports:
- "3307:3306"
Run Code Online (Sandbox Code Playgroud)
意味着Docker会将3307主机端口映射到3306容器的端口.所以你可以从Sequel访问localhost:3307.
但是,这并不意味着容器正在存在3307; 容器实际上仍在听取3306.当其他容器尝试访问mysqlDNS时,它会转换为内部容器IP,因此您必须连接到3306.
因此,您的节点配置应如下所示:
const config = {
host: 'mysql',
database: 'mydb',
port: '3306',
user: 'mysql',
password: '1234',
connectionLimit: 10
}
Run Code Online (Sandbox Code Playgroud)
这在你的docker-compose.yml中:
command: ["./wait-for-it.sh", "mysql:3306"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9073 次 |
| 最近记录: |