当前位置: 首页 > 知识库问答 >
问题:

使用pm2在Docker容器内启动两个nodejs应用程序

吕飞翼
2023-03-14

我正试图使用PM2在Docker容器中启动2个nodejs应用程序,所以我制作了一个带有所有项目配置的定制Dockerfile

FROM node:argon

RUN npm install pm2 -g --silent

VOLUME ./src/app:/usr/src/app
WORKDIR /usr/src/app

RUN git clone https://github.com/yoonic/atlas.git backend
RUN cd backend && \
    npm i --silent && \
    pm2 start npm --name "backend" -- run dev --no-daemon

RUN git clone https://github.com/yoonic/nicistore.git frontend
RUN cd frontend && \
    npm i --silent && \
    sed -i "s#api.atlas.baseUrl#http://localhost:8000/v1#" config/client/development.js && \
    pm2 start npm --name "frontend" -- run dev --no-daemon

我用这个配置启动这个容器

# NodeJS
nodejs:
  build: docker/nodejs
  container_name: nodejs
  ports:
    - 53000:3000
    - 54000:4000

当所有的容器都设置好后,我在终端中得到PM2进程列表,然后docker compose启动所有的容器,但我发现一个节点立即失败

Nodejs退出代码0

我的nodejs应用程序正在我的容器内工作,但这一个立即退出。。。

这是正确的方法吗?也许不需要PM2?

我怎样才能让它工作?

编辑

当我不使用--no-daemon时,容器会退出,因为它认为一切都完成了。但是当我使用--no-daemon时,构建过程永远不会完成,因为它会向我显示nodejs应用程序日志

共有2个答案

梁马鲁
2023-03-14

首先,尽管可以在一个容器中运行多个进程,但通常最好的方法是每个容器只使用一个进程。因此,您的docker compose中有两个服务。yml——一个用于后端,另一个用于前端。

您的Dockerfile中有一些问题需要解决:

  1. 使用ADDCOPY代替VOLUME将文件复制到容器
  2. 使用RUN命令仅用于安装npm包等以准备映像。
  3. 使用COMMANDENTRYPOINT定义在容器启动时运行的命令。

因此,容器退出的原因是您没有指定自己的COMMAND,因此运行节点: argon的默认命令。由于默认命令是启动节点REPL,如果容器没有以交互模式运行,它就会退出,因此容器在启动时会立即退出。

我现在有点忙,不能用工作代码准备一个完整的例子。你能通过这些技巧找到前进的道路吗?:)

松洛华
2023-03-14

使用流程文件管理这两个应用程序:http://pm2.keymetrics.io/docs/usage/application-declaration/

例如:过程。yml:

apps:
  - script : 'npm'
    args   : 'run dev'
    cwd    : './backend'
    name   : 'backend'
  - script : 'npm'
    args   : 'run dev'
    cwd    : './frontend'
    name   : 'frontend'

然后在Dockerfile中:

CMD ['pm2-docker', 'process.yml']

PM2/Docker集成文档:http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/

 类似资料:
  • 我们有一个公开REST API的现有java应用程序。当它收到超文本传输协议请求时,它使用Runtime.getRuntime(). exe启动另一个java进程。 我们正在将此应用程序迁移到docker,我们希望将这些服务、一个容器中的REST应用程序和另一个容器中的其他组件分开。 有没有办法,REST应用程序可以在另一个docker容器中启动另一个应用程序?

  • 问题内容: 我正在重构几个node.js服务。所有这些以前都是在虚拟服务器上开始的,如果进程崩溃,它们只会重新启动。 现在,转向容器化和无状态的应用程序结构,我认为该过程应该退出,并且应该在发生故障时重新启动容器。 那是对的吗?有好处还是不利? 问题答案: 我的想法是不要使用容器内进程管理器(永远是pm2),而是通过(或该选项的其他一种方式)使用docker restart策略。这与整个docke

  • 问题内容: 鉴于: 基于ubuntu的容器:13.10 已安装ssh(通过) 问题:每次启动容器时,我都必须手动运行sshd 尝试过:,但无济于事。 问题:如何设置容器以在容器启动期间自动启动sshd服务? 问题答案: 您可以尝试使用phusion / baseimage-docker实现更优雅的方式 https://github.com/phusion/baseimage- docker#rea

  • 给定: 基于Ubuntu:13.10的容器 已安装ssh(通过)

  • 我有一个简单的nodeJs应用程序,它使用快速框架。我可以在docker容器中成功运行这个应用程序。 我需要从VS代码远程调试这个应用程序如何做到这一点。 我在远程调试中采取的以下步骤 docker构建命令 docker运行命令 运行docker后,it控制台输出一条消息 调试器侦听127.0.0.1:5858 但是我无法从本地主机:8080访问节点应用程序,也无法从VScode进行调试。