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

rom*_*n95 2 node.js docker dockerfile

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

  • app1.js 在端口 1001 上运行
  • app2.js 在端口 1002 上运行
  • app3.js 在端口 1003 上运行
  • app4.js 在端口 1004 上运行

Dockerfile

FROM node:latest
WORKDIR /rootfolder
COPY package.json ./
RUN npm install
COPY . .
RUN chmod +x /script.sh
RUN /script.sh
Run Code Online (Sandbox Code Playgroud)

脚本文件

#!/bin/sh
node ./app1.js
node ./app2.js
node ./app3.js
node ./app4.js
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 5

您几乎总是在单独的容器中运行它们。您可以从同一映像运行多个容器,您可以在启动映像时覆盖映像的默认命令,并且可以在启动应用程序时重新映射应用程序使用的端口。

在 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
Run Code Online (Sandbox Code Playgroud)

(我假设所有脚本都侦听默认的 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
Run Code Online (Sandbox Code Playgroud)

Compose 将自行创建 Docker 网络,并负责命名镜像和容器。 docker-compose up将并行启动所有服务。