使用pm2

时间:2016-12-19 13:56:18

标签: node.js docker dockerfile pm2

我试图使用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 app logs

2 个答案:

答案 0 :(得分:4)

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

例如 - process.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/

答案 1 :(得分:1)

首先,虽然you can run several processes in one container通常最好的方法是每个容器只使用一个进程。所以你的docker-compose.yml会有两个服务 - 一个用于后端,另一个用于前端。

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

  1. 使用ADDCOPY代替VOLUME将文件复制到容器
  2. 使用RUN命令仅用于安装npm软件包等以准备图像。
  3. 使用COMMANDENTRYPOINT定义容器启动时运行的命令。
  4. 因此,您的容器退出的原因是您没有指定自己的COMMAND,因此运行node:argon的默认命令。由于默认命令是启动节点REPL,如果容器未以交互模式运行,它将退出,您的容器会在启动时立即退出。

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