如何在一个容器中运行所有Node.js文件?
Dockerfile
FROM node:latest
WORKDIR /rootfolder
COPY package.json ./
RUN npm install
COPY . .
RUN chmod +x /script.sh
RUN /script.sh
script.sh
#!/bin/sh
node ./app1.js
node ./app2.js
node ./app3.js
node ./app4.js
答案 0 :(得分:1)
您几乎总是在单独的容器中运行它们。您可以从同一映像运行多个容器,可以在启动映像时覆盖该映像的默认命令,还可以重新映射应用程序在启动时使用的端口。
在Dockerfile中,删除末尾的RUN /script.sh
行。 (这将尝试在映像构建期间尝试启动服务器,而您不需要这样做。)现在,您可以构建并运行容器:
docker build -t myapp . # build the image
docker network create mynet # create a Docker network
docker run \ # run the first container...
-d \ # in the background
--net mynet \ # on that network
--name app1 \ # with a known name
-p 1001:3000 \ # publishing a port
myapp \ # from this image
node ./app1.js # running this command
docker run \
-d \
--net mynet \
--name app2 \
-p 1002:3000 \
myapp \
node ./app2.js
(我假设所有脚本都在默认的Express端口3000上侦听,该端口是-p
选项中的第二个端口号。)
Docker Compose是用于同时运行多个容器的有用工具,可以复制此功能。与此设置匹配的docker-compose.yml
文件如下所示:
version: '3.8'
services:
app1:
build: .
ports:
- 1001:3000
command: node ./app1.js
app2:
build: .
ports:
- 1002:3000
command: node ./app2.js
Compose将自己创建一个Docker网络,并负责命名映像和容器。 docker-compose up
将并行启动所有服务。
答案 1 :(得分:0)
您试图实现的目标被认为是反模式。
相反,在构建应用程序堆栈时要牢记单一职责原则,这将为您提供更好的管理,监视,更改应用程序等的优势。
This文章介绍了您何时需要执行此操作。
如果您要整体管理多个容器,则每个js都有一个Dockerfile,再结合docker-compose文件以一次在不同端口上调出所有容器,可能会回答您的问题。这是一个最小的示例:
docker-compose.yml
version: '3.7'
services:
app1:
image: your-js-app-1-image
container_name: app-1
ports:
- '1001:3000'
app2:
image: your-js-app-2-image
container_name: app-2
ports:
- '1002:3000'
答案 2 :(得分:0)
您需要先使用以下方法公开端口:
EXPOSE 1001
...
EXPOSE 1004
在您的dockerfile中,然后像-p 1501:1001一样使用-p参数运行容器 暴露例如主机的端口1501作为容器的1001端口。
ref:https://docs.docker.com/engine/reference/commandline/run/
但是,建议最小化要从Docker容器运行的程序的数量。因此,您可能希望为每个js脚本提供一个容器。
但是,没有什么可以阻止您使用:
docker exec -it yourDockerMachineName bash
可以多次使用每个节点cmds。