Запустите Nodejs и Docker, затем передайте параметр в index. js в одном выражении - PullRequest
0 голосов
/ 23 января 2020

Я написал программу, используя Node.js, она использует MySQL из docker. Кроме того, мой node.js имеет файл Index. js, который требует ввода от пользователя, на основании которого он будет продолжать выполнять различные типы операций. Для этого мне нужно выполнить следующие команды:

1. docker-compose up --build -d, которые будут запускать различные контейнеры.

2. docker-compose exec web sh -c "npm start", которые запустят приложение Node.js.

3. one параметр, предоставленный пользователем, который будет взят по индексу. js и на основе этого параметра может быть выполнена другая операция с базой данных.

Теперь я хотел удалить эти 3 различных шага и объедините их, чтобы сделать так, чтобы пользователи могли предоставлять только однострочный запрос, и его можно было прочитать и запустить. Есть ли способ объединить эти вещи и выполнить их все вместе.

Мой index.js файл выглядит примерно так:

const   express     =   require('express');
const   http        =   require("http");
const   bodyParser  =   require('body-parser');
const   app         =   express();
const   basePath    =   __dirname;
const   path        =   require('path');
const   reqPath     =   path.join(__dirname, './');
const   fs          =   require('fs');
const   port        =   process.env.PORT || 9000;
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true }));

//Make NodeJS to Listen to a particular Port in Localhost
app.listen(port, function(){
getInput(function(data){
if(data.trim() === "Player")
{
 console.log("ONE");
}
});
    });

//function to take the input from the user and return it to calling function
function getInput(callback)
{
    var standard_input = process.stdin;
    standard_input.setEncoding('utf-8');
    standard_input.on('data', function (data) {
        callback(data);
    });
}

Вот мой файл docker-compose.yaml со всеми службами :

version: '3'

services:
  db:
    container_name: db
    image: mysql:5.7
    volumes:
      - "./data/mysql:/var/lib/mysql:rw"
    environment:
      MYSQL_DATABASE: database
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: rootuser
      MYSQL_PASSWORD: password
      DATABASE_HOST: 127.0.01
    restart: always

  web:
    container_name: web
    image: node:8
    volumes:
      - ./web:/usr/src/app
    working_dir: /usr/src/app
    depends_on:
      - db
    restart: on-failure
    command: "tail -f /dev/null"
    environment:
      project: ${project}
      type: ${type}

1 Ответ

1 голос
/ 23 января 2020

Чтобы не вводить команду docker-compose exec, вы можете определить command или entrypoint для этого контейнера (web) в файле docker-compose.yaml. См. Составьте файл документации . Это сообщит вашему контейнеру, какую команду запускать при запуске.

Тогда вы можете, например, заставить index.js принимать параметры откуда-то еще, чем пользовательский ввод. Вместо этого я бы сделал так, чтобы он читал переменные окружения и связывал его через docker-compose.yaml. Итак, на стороне узла вместо getInput() вы бы использовали process.env.MY_INPUT_VARIABLE. Со стороны Compose, вы можете добавить переменную окружения к вашей службе web, используя клавишу environment:, которая выглядит следующим образом:

services:
  web:
    environment:
      MY_INPUT_VARIABLE: ${MY_INPUT_VARIABLE_HOST}

Затем запустите docker -compose в маленьком bash скрипт, который использует свой первый аргумент ("$1") для определения и экспорта переменной среды «MY_INPUT_VARIABLE_HOST», а затем запускает команду docker-compose up. Когда docker-compose запускается, он будет читать ${MY_INPUT_VARIABLE_HOST} и заменять его значением переменной. Он назначит его MY_INPUT_VARIABLE внутри контейнера, и Node сможет прочитать его в своем process.env.

Предполагая, что вы вызываете скрипт bash что-то вроде run-containers, единственная команда ./run-containers Player сделает то же самое, что и ваша команда docker-compose up, затем ваша команда docker-compose exec с последующим вводом Player по запросу узла.

...