我正试图使用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应用程序日志
首先,尽管可以在一个容器中运行多个进程,但通常最好的方法是每个容器只使用一个进程。因此,您的docker compose中有两个服务。yml
——一个用于后端,另一个用于前端。
您的Dockerfile
中有一些问题需要解决:
ADD
或COPY
代替VOLUME
将文件复制到容器RUN
命令仅用于安装npm包等以准备映像。COMMAND
或ENTRYPOINT
定义在容器启动时运行的命令。因此,容器退出的原因是您没有指定自己的COMMAND
,因此运行节点: argon
的默认命令。由于默认命令是启动节点REPL,如果容器没有以交互模式运行,它就会退出,因此容器在启动时会立即退出。
我现在有点忙,不能用工作代码准备一个完整的例子。你能通过这些技巧找到前进的道路吗?:)
使用流程文件管理这两个应用程序: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进行调试。