【问题标题】:Launch two nodejs app inside Docker container using pm2使用 pm2 在 Docker 容器内启动两个 nodejs 应用程序
【发布时间】:2016-12-20 00:43:51
【问题描述】:

我正在尝试使用 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

我用docker-compose up 用这个配置启动这个容器

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

当所有容器都设置好后,我在终端中获得了 PM2 进程列表 然后 docker-compose 启动我所有的容器,但我的 nodejs 立即失败了

nodejs 以代码 0 退出

我的 nodejs 应用程序正在我的容器中运行,但这个应用程序立即退出......

这是完成这项工作的正确方法吗? PM2 可能不需要?

我怎样才能使它工作?

编辑

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

【问题讨论】:

    标签: node.js docker dockerfile pm2


    【解决方案1】:

    使用一个进程文件来管理这两个应用程序: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/

    【讨论】:

      【解决方案2】:

      首先,尽管you can run several processes in one container 通常最好的方法是每个容器只使用一个进程。因此,您的 docker-compose.yml 中将有两项服务 - 一项用于后端,另一项用于前端。

      您的Dockerfile 中有一些问题需要修复:

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

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

      我现在有点忙,无法准备一个完整的带有工作代码的示例。您能通过这些提示找到前进的道路吗? :)

      【讨论】:

      • 好的,我会纠正我的错误,如果我仍然无法让这个容器工作,我会再给你发一条评论
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 2018-03-15
      • 2015-05-18
      • 1970-01-01
      • 2016-01-16
      • 2016-02-11
      • 1970-01-01
      相关资源
      最近更新 更多