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

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

如何在一个容器中运行所有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

解决方法

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

在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将并行启动所有服务。

,

您试图实现的目标被认为是反模式。
相反,在构建应用程序堆栈时要牢记单一职责原则,这将为您提供更好的管理,监视,更改应用程序等的优势。

官方文档中的

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'
,

您需要先使用以下方法公开端口:

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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-