Node.js 启动Nodejs和Docker,然后在单个语句中将参数传递给index.js

Node.js 启动Nodejs和Docker,然后在单个语句中将参数传递给index.js,node.js,docker,docker-compose,dockerfile,containers,Node.js,Docker,Docker Compose,Dockerfile,Containers,我已经使用Node.js编写了一个程序,它使用docker提供的MySQL。另外,my node.js有Index.js文件,它需要用户的输入,并根据输入继续执行不同类型的操作。为了执行这个,我需要运行以下命令 1。docker compose up--build-d,它将启动各种容器 2。docker compose exec web sh-c“npm start”将启动Node.js应用程序 3。用户提供的一个参数将由index.js获取,根据该参数可以执行不同的数据库操作 现在,我想删除这

我已经使用Node.js编写了一个程序,它使用docker提供的MySQL。另外,my node.js有Index.js文件,它需要用户的输入,并根据输入继续执行不同类型的操作。为了执行这个,我需要运行以下命令

1。docker compose up--build-d
,它将启动各种容器

2。docker compose exec web sh-c“npm start”
将启动Node.js应用程序

3。用户提供的一个
参数将由index.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}

为了避免键入
docker compose exec
命令,您可以在
docker compose.yaml
文件中为该容器(
web
)定义
命令或
入口点。看见这将告诉您的容器在启动时运行哪个命令

然后,您可以让您的
index.js
从用户输入以外的地方接受参数。我会让它读取环境变量,并通过
docker compose.yaml
绑定它。因此,在节点端,您将使用
process.env.MY\u INPUT\u变量,而不是
getInput()
。在编写方面,您可以使用
environment:
键将环境变量添加到
web
服务中,如下所示:

services:
  web:
    environment:
      MY_INPUT_VARIABLE: ${MY_INPUT_VARIABLE_HOST}
然后在一个小bash脚本中运行docker compose up,该脚本使用其第一个参数(
“$1”
)定义并导出环境变量“MY_INPUT_variable_HOST”,然后运行
docker compose up
命令。当运行
docker compose
时,它将读取
${MY\u INPUT\u VARIABLE\u HOST}
,并用变量的值替换它。它将把它分配给容器内的
MY\u INPUT\u变量
,节点将能够在其
process.env
中读取它


假设您调用bash脚本类似于
runcontainers
,单个命令
/runcontainers Player
将执行与运行
docker compose up
命令相同的操作,然后是
docker compose exec
命令,然后在节点提示时输入
Player

感谢您的回复。我现在能够接受来自环境的变量,但我不理解入口点。我已经在上面发布了我的docker-compose.yaml文件,你能告诉我更多信息吗?@BATMAN_2008现在,你的
web
服务的
命令设置为
tail-f/dev/null
,这意味着它在启动时不会做任何特别有用的事情。如果将其替换为其他命令,如
npm start
,则此命令将在容器启动时运行
tail-f/dev/null
是一个运行容器的巧妙技巧,它永远不会崩溃,但是它不是很有用,因为容器开始什么都不做。现在,entrypoints是一种不同的方式来指定在容器启动时运行什么,但是您现在可以忽略它,这在您的场景中无关紧要。感谢您的响应。那么,我是否可以删除命令
tail-f/dev/null
,并将其替换为
entrypoint
,以便我的docker启动并自动侦听“web”?或者你能给我推荐其他的方法吗?