首页 > 解决方案 > 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

标签: mysqldockerdocker-compose

解决方案


解决了它,该错误在开始NodeJS之前运行Mysql。docker compose 版本 3 不支持 for depends_on,添加wait-for-it.shapp具有等待永远设置的服务,因此现在NodeJs将等到Mysql启动。

command: ["./wait-for-it.sh", "-t", "0", "db:3306", "--", "npm", "start"]

注意:我将它添加到旁边depends_on,然后它可以正常工作,否则会出现权限错误。

参考:


推荐阅读