Node.js 启动Nodejs和Docker,然后在单个语句中将参数传递给index.js
我已经使用Node.js编写了一个程序,它使用docker提供的MySQL。另外,my node.js有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获取,根据该参数可以执行不同的数据库操作 现在,我想删除这
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”?或者你能给我推荐其他的方法吗?