mysql - Docker:NodeJs 由于 Mysql 连接而崩溃
问题描述
使用Docker-compose version 3
,两个容器在 3306(mysql)、5002(app) 处运行良好,但 nodejs 未连接到mysql
服务
Docker 容器列表:
8e475b1fd110 app "npm start" 15 seconds ago Up 10 seconds 0.0.0.0:5002->5002/tcp
d5fe68309cd4 mysql:5.7 "docker-entrypoint.s…" 19 seconds ago Up 15 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp
app
和的 docker 日志mysql
。
应用程序 Docker 日志:
docker logs --details 8e475b1fd110
> rest@1.0.0 start /home/node/src/server
> nodemon --exec babel-node src/server.js
[nodemon] 2.0.2
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `babel-node src/server.js`
Server started at port 5002
/home/node/src/server/src/config/db.js:26
if (err) throw err;
^
Error: connect ECONNREFUSED 172.22.0.2:3306
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1097:14)
--------------------
at Protocol._enqueue (/home/node/src/server/node_modules/mysql/lib/protocol/Protocol.js:144:48)
at Protocol.handshake (/home/node/src/server/node_modules/mysql/lib/protocol/Protocol.js:51:23)
at Connection.connect (/home/node/src/server/node_modules/mysql/lib/Connection.js:119:18)
at Object.<anonymous> (/home/node/src/server/src/config/db.js:12:12)
[nodemon] app crashed - waiting for file changes before starting...
Mysql Docker 日志:
2020-01-16T08:20:29.252232Z 0 [Note] mysqld (mysqld 5.7.28) starting as process 1 ...
2020-01-16T08:20:29.273098Z 0 [Note] InnoDB: PUNCH HOLE support available
2020-01-16T08:20:29.273139Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
......
2020-01-16T08:20:29.652300Z 0 [Note] IPv6 is available.
2020-01-16T08:20:29.652315Z 0 [Note] - '::' resolves to '::';
2020-01-16T08:20:29.652337Z 0 [Note] Server socket created on IP: '::'.
2020-01-16T08:20:29.689338Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2020-01-16T08:20:29.708091Z 0 [Note] Event Scheduler: Loaded 0 events
2020-01-16T08:20:29.708416Z 0 [Note] mysqld: ready for connections.
Version: '5.7.28' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
Dockerfile
FROM node:10.15.3-jessie
ENV APP_HOME=/home/node/src/server
WORKDIR ${APP_HOME}
COPY package.json .
RUN npm install -g npm
COPY . .
USER node
EXPOSE 5002
CMD ["npm", "start"]
码头工人-compose.yml
version: '3'
services:
db:
container_name: db_mysql
image: mysql:5.7
ports:
- '3306:3306'
environment:
- MYSQL_ROOT_USER=root
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=sampledb
networks:
- dbnet
app:
container_name: app_server
restart: always
build: .
ports:
- '5002:5002'
depends_on:
- db
environment:
- PORT=5002
- NODE_ENV=development
- DB_HOST=db_mysql
- DB_PORT=3306
- DB_PASSWORD=root
- DB_USER=root
- DB_DATABASE=sampledb
networks:
- dbnet
networks:
dbnet:
external: true
通过运行创建网络docker network create dbnet
数据库.js
import mysql from "mysql";
const connection = mysql.createConnection({
host: "db_mysql", // using DB container name
user: "root",
password: "root",
database: "sampledb"
});
// connect to database
connection.connect(function(err) {
if (err) throw err
console.log('You are now connected with mysql database...')
});
export default connection
解决方案
解决了它,该错误在开始NodeJS
之前运行Mysql
。docker compose 版本 3 不支持 for depends_on
,添加wait-for-it.sh
到app
具有等待永远设置的服务,因此现在NodeJs
将等到Mysql
启动。
command: ["./wait-for-it.sh", "-t", "0", "db:3306", "--", "npm", "start"]
注意:我将它添加到旁边depends_on
,然后它可以正常工作,否则会出现权限错误。
参考: