Dockerfile-为多个Node.js应用程序构建docker映像

时间:2020-08-18 06:54:49

标签: node.js docker dockerfile

如何在一个容器中运行所有Node.js文件?

  • 在端口1001上运行的app1.js
  • 在端口1002上运行的app2.js
  • 在端口1003上运行的app3.js
  • 在端口1004上运行的app4.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

3 个答案:

答案 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。