使用 pm2 在 Docker 容器内启动两个 nodejs 应用程序
Launch two nodejs app inside Docker container using pm2
我正在尝试使用 PM2 在 Docker 容器中启动 2 个 nodejs 应用程序,所以我制作了一个包含所有项目配置的自定义 Docker 文件
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 exited with code 0
我的 nodejs 应用程序在我的容器中运行,但这个应用程序立即退出...
这是完成这项工作的正确方法吗?
也许不需要 PM2?
我怎样才能让它工作?
编辑
当我不使用 --no-daemon
时容器退出,因为它认为一切都已完成。
但是当我使用 --no-daemon
时,构建过程永远不会完成,因为它向我显示了 nodejs 应用程序日志
首先,虽然 you can run several processes in one container 通常最好的方法是每个容器只使用一个进程。因此,您的 docker-compose.yml
中将有两项服务 - 一项用于后端,另一项用于前端。
您的 Dockerfile
中存在一些需要修复的问题:
- 使用
ADD
或COPY
代替VOLUME
将文件复制到容器
- 仅使用
RUN
命令安装 npm 包等来准备镜像。
- 使用
COMMAND
或ENTRYPOINT
定义容器启动时运行的命令。
因此,您的容器退出的原因是您没有指定自己的 COMMAND
,因此来自 node:argon
的默认命令是 运行。由于默认命令是启动 Node REPL,如果容器未处于交互模式 运行,它会退出,因此您的容器会在启动时立即退出。
我现在有点忙,无法准备一个完整的示例代码。您能通过这些技巧找到前进的道路吗? :)
使用进程文件管理这两个应用程序: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/
我正在尝试使用 PM2 在 Docker 容器中启动 2 个 nodejs 应用程序,所以我制作了一个包含所有项目配置的自定义 Docker 文件
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 exited with code 0
我的 nodejs 应用程序在我的容器中运行,但这个应用程序立即退出...
这是完成这项工作的正确方法吗? 也许不需要 PM2?
我怎样才能让它工作?
编辑
当我不使用 --no-daemon
时容器退出,因为它认为一切都已完成。
但是当我使用 --no-daemon
时,构建过程永远不会完成,因为它向我显示了 nodejs 应用程序日志
首先,虽然 you can run several processes in one container 通常最好的方法是每个容器只使用一个进程。因此,您的 docker-compose.yml
中将有两项服务 - 一项用于后端,另一项用于前端。
您的 Dockerfile
中存在一些需要修复的问题:
- 使用
ADD
或COPY
代替VOLUME
将文件复制到容器 - 仅使用
RUN
命令安装 npm 包等来准备镜像。 - 使用
COMMAND
或ENTRYPOINT
定义容器启动时运行的命令。
因此,您的容器退出的原因是您没有指定自己的 COMMAND
,因此来自 node:argon
的默认命令是 运行。由于默认命令是启动 Node REPL,如果容器未处于交互模式 运行,它会退出,因此您的容器会在启动时立即退出。
我现在有点忙,无法准备一个完整的示例代码。您能通过这些技巧找到前进的道路吗? :)
使用进程文件管理这两个应用程序: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/