我有一个 Node 应用程序,它由三个独立的 Node 服务器组成,每个服务器由pm2 start
. 我同时使用来运行三个服务器,作为 package.json 中的启动脚本:
"scripts": {
...
"start-all": "concurrently \" pm2 start ./dist/foo.js \" \"pm2 start ./dist/bar.js \" \"pm2 start ./dist/baz.js\"",
"stop-all": "pm2 stop all",
"reload-all": "pm2 reload all",
...
}
从 localhost 上的命令行运行时,这一切都运行良好,但是当我将其作为RUN
docker-compose 命令或作为 Dockerfile 中的命令运行时,只有一个服务器脚本(每次尝试时随机一个!)将启动,但随后立即退出。在我的--verbose
docker-compose 输出中,我可以看到 pm2 面板(列表名称、版本、模式、pid 等),但随后出现以下错误消息:
pm2 start ./dist/foo.js exited with code 0
.
注意:这都是 Docker 在本地运行的(在具有 16GB RAM 的 Mac Mini 上),而不是在远程服务器上。
如果我docker exec -it <container_name> /bin/bash
进入容器并npm run start-all
从 src 目录的顶层手动运行(我COPY
在我的 Dockerfile 中)一切正常。这是我的 Dockerfile:
FROM node:latest
# Create the workdir
RUN mkdir /myapp
WORKDIR /myapp
# Install packages
COPY package*.json ./
RUN npm install
# Install pm2 and concurrently globally.
RUN npm install -g pm2
RUN npm install -g concurrently
# Copy source code to the container
COPY . ./
在我的 docker-compose 文件中,我只是将 npm run start-all 列为 Node 服务的命令。但是如果我像这样将它添加到 Dockerfile 中并没有什么区别:
RUN npm run start-all
可能会发生什么?pm2 日志只显示应用程序已启动的报告。