Я получаю сообщение об ошибке использования порта при попытке запустить контейнер Docker для приложения nodejs и mysql с помощью docker-compose - PullRequest
0 голосов
/ 23 октября 2019

Как я могу использовать docker-compose для создания контейнера и передачи параметра моему приложению Node.js во время запуска?

Я пытаюсь написать программу, в которой я могу подключиться к MYSQL с помощью NODEJS ииспользуя DOCKER-COMPOSE. Мне нужно запустить приложение в терминале, чтобы я мог передать некоторые параметры моему приложению Node.js во время запуска, поэтому мне нужно запустить DOCKER-COMPOSE UP, чтобы вызвать приложение, и MYSQL, а затем я хочу запустить приложение, используяCLI в другом окне.

Здесь находится мой index.js файл, находящийся в папке web, который будет принимать данные от пользователя, когда я запускаю следующую команду nodemon start New.

     //Make NodeJS to Listen to a particular Port in Localhost
const   port        =   9010; 
     app.listen(port, function(){
        // Start the server and read the parameter passed by User
        console.log("Node js is Running on : "+port);
        // Get process.stdin as the standard input object.
        var standard_input = process.stdin;

        // Set input character encoding.
        standard_input.setEncoding('utf-8');

        // Prompt user to input data in console.
        console.log("Please input text in command line.");

        // When user input data and click enter key.
        standard_input.on('data', function (data) {
            console.log(" DATA ENTERED BY USER IS :"+data);
        });
    });

Я хочу добиться этого, используя docker-compose, поэтому у меня есть следующий код для файла docker-compose.yml.

version: '3'

services:
  db:
    build: ./db
    environment:
      MYSQL_DATABASE: mydb
      MYSQL_ROOT_PASSWORD: mypass
      MYSQL_USER: mysql
      MYSQL_PASSWORD: mypass
      DATABASE_HOST: myhost
  web:
    build: ./web
    depends_on:
      - db
    restart: on-failure
    ports:
      - "9010:9010"

  adminer:
    image: adminer
    restart: always
    ports:
      - "7778:8080"

Мой Dockerfile для Интернета или Node.js в папке web:

FROM node:8

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 9010

CMD ["npm","start"]

My Dockerfile для базы данных MYSQL в папке db:

FROM mysql:5.7

EXPOSE 3306

COPY ./scripts /docker-entrypoint-initdb.d/

Теперь, когда я запускаю команду docker-compose up --build для docker-compose.ymlфайл то все работает нормально;приложение контейнера и Node.js запускается.

Когда я открываю другое окно терминала и пытаюсь перейти к контейнеру web, используя docker-compose exec web sh, и запускаю приложение узла для передачи параметров nodemon start New, тогда я получаюследующая ошибка.

events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE :::9010
    at Server.setupListenHandle [as _listen2] (net.js:1360:14)

Поскольку приложение Nodejs уже запущено, когда я выполнил команду docker-compose up --build, порт уже назначен, поэтому я получаю эту ошибку, как я могу запустить приложение Indey.js и передатьпараметры к нему?

Я использую Ubuntu Os для приложения.

1 Ответ

1 голос
/ 23 октября 2019

Причина в том, что уже запущено приложение nodejs, которое запускается с CMD и заняло порт, поэтому при запуске команды внутри docker вы получаете ошибку EDDRINUSE.

У вас будет несколько вариантов,

  • Не запускайте приложение узла из CMD докера, но вы не заметите, когда nodejs обработают внутри контейнера. Но с этим можно справиться, поэтому измените CMD в узле Dockerfile
CMD ["npm","start"]
#change the above cmd to
CMD tail -f /dev/null

Это только поддержит ваш контейнер nodejs и затем запустит команду внутри контейнера.

docker-compose exec web sh
nodemon start New
  • Измените порт для сценария, который вы запускаете вручную, чтобы не возникало конфликтов, так как сценарий запускается на другом порту,

Обновите код nodejs немного

//Make NodeJS to Listen to a particular Port in Localhost
const   port        =   process.env.PORT; 

Теперь запустите процесс с другим портом

PORT=9011 nodemon start New
...