docker compose с использованием узлов js и mysql - невозможно соединиться с mysql - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь развернуть приложение js узла с помощью Docker, но когда я запускаю Docker, создайте его, выдав ошибку в конце.Я пробовал некоторые решения, такие как использование файла wait-for-it.sh, но проблема все еще существует.

docker-compose.yml

version: '3'
services:
  db:
    build:
      context: .
      dockerfile: ./docker/Dockerfile-mysql
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_DATABASE=dbautokab
      - MYSQL_USER=root
      - MYSQL_PASSWORD=
    networks:
      - helicopter-network
    healthcheck:
      test: "exit 0"

  helicopter-api:
    build:
      context: .
      dockerfile: ./docker/Dockerfile-api
    depends_on:
      - db
    networks: ['helicopter-network']
    environment:
        - PORT=3000
        - DATABASE_HOST=db
        - DATABASE_PASSWORD=
        - EGG_SERVER_ENV=local
        - NODE_ENV=development
    ports:
      - "3000:3000"
networks:
  helicopter-network:
    driver: bridge

Dockerfile-api

FROM node:10-slim

USER node

RUN mkdir -p /home/node/app

WORKDIR /home/node/app

COPY --chown=node package*.json ./

RUN npm install

COPY --chown=node . .

COPY wait-for-it.sh /

ENV HOST=0.0.0.0 PORT=3000

EXPOSE ${PORT}

# Run when the container launches
#CMD [ "node", "." ]
CMD /wait-for-it.sh db:3306 -- npm start

Dockerfile-mysql

FROM mysql 

COPY ./docker/init_db.sql /docker-entrypoint-initdb.d/

init_db.sql

CREATE DATABASE IF NOT EXISTS dbautokab;
GRANT ALL PRIVILEGES on dbautokab.*
TO 'root'@'%'
WITH GRANT OPTION;

db.js

var mysql = require('mysql');

var db_config = {
host     : '127.0.0.1', // Your host - either local or cloud  
user     : 'root', // your username
password : '', // your password
database : 'dbautokab' // database name
};

var connection;

function handleDisconnect() {
connection = mysql.createConnection(db_config); // Recreate the     connection, since
                                                // the old one cannot be reused.

connection.connect(function(err) {              // The server is either down
    if(err) {                                     // or restarting (takes a while sometimes).
        console.log('error when connecting to db:', err);
        setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect,
    }

                                 // to avoid a hot loop, and to allow our node script to
});                                     // process asynchronous requests in the meantime.
                                        // If you're also serving http, display a 503 error.
connection.on('error', function(err) {
    console.log('db error', err);
    if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
        handleDisconnect();                         // lost due to either server restart, or a
    } else {                                      // connnection idle timeout (the wait_timeout
        throw err;                                  // server variable configures this)
    }
});
}

handleDisconnect();

module.exports = connection;

Ошибка:

helicopter-api_1 |Сервер работает на 3000вертолет-api_1 |ошибка при подключении к БД: {Ошибка: подключить ECONNREFUSED 127.0.0.1:3306вертолет-api_1 |в TCPConnectWrap.afterConnect [как oncomplete] (net.js: 1106: 14)вертолет-api_1 |--------------------вертолет-api_1 |в Protocol._enqueue (/home/node/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)вертолет-api_1 |в Protocol.handshake (/home/node/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)вертолет-api_1 |в Connection.connect (/home/node/app/node_modules/mysql/lib/Connection.js:119:18)вертолет-api_1 |в handleDisconnect (/home/node/app/db.js:16:16)вертолет-api_1 |на объекте.(/Home/node/app/db.js:35:1)вертолет-api_1 |в Module._compile (внутренний / modules / cjs / loader.js: 776: 30)вертолет-api_1 |в Object.Module._extensions..js (внутренняя / modules / cjs / loader.js: 787: 10)вертолет-api_1 |в Module.load (внутренний / modules / cjs / loader.js: 653: 32)вертолет-api_1 |в tryModuleLoad (внутренний / modules / cjs / loader.js: 593: 12)вертолет-api_1 |в Function.Module._load (внутренняя / modules / cjs / loader.js: 585: 3)вертолет-api_1 |errno: 'ECONNREFUSED',вертолет-api_1 |код: «ECONNREFUSED»,вертолет-api_1 |системный вызов: «подключиться»,вертолет-api_1 |адрес: «127.0.0.1»,вертолет-api_1 |порт: 3306,вертолет-api_1 |роковая: правда}db_1 |db_1 |/usr/local/bin/docker-entrypoint.sh: работает /docker-entrypoint-initdb.d/init_db.sqldb_1 |db_1 |

enter image description here

1 Ответ

0 голосов
/ 18 июня 2019

Ваш nodejs app & db не находится в том же контейнере, поэтому db.js не может посетить db с ip 127.0.0.1.

Добавьте container_name: mydb к вашей службе БД, как показано ниже:

services:
  db:
    build:
      context: .
      dockerfile: ./docker/Dockerfile-mysql
    container_name: mydb

Затем в db.js используйте имя контейнера, чтобы посетить db:

var db_config = {
 host     : 'mydb', // Your host - either local or cloud  
 user     : 'root', // your username
 password : '', // your password
 database : 'dbautokab' // database name
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...