HES*_*non 6 process-management node.js docker
我大约一个月前开始使用 docker,但找不到令人满意的解决方案来解决以下情况。
我想部署一个 NodeJS 应用程序,因为使用ENTRYPOINT是最佳实践,所以我更喜欢使用这个命令:
ENTRYPOINT ["node", "src/start.js"].
但是,我还没有找到在容器内重新启动入口点进程的方法,这意味着每次我更改 nodejs 应用程序中的某些内容时,我都必须重新启动整个容器,这在具有共享卷的开发环境中有点烦人。
我想到的一个解决方案是为此使用流程管理器,并执行类似的操作,ENTRYPOINT ["pm2", "src/start.js"]但对单个流程使用流程管理器对我来说似乎是错误的。
我想寻求一种方法,让我尽可能接近热插拔,而无需在“开发 Docker”和“生产 Docker”之间更改 Dockerfile。
TL;DR:应该可以在我的开发机器上不安装 NodeJS 或应用程序需要的任何东西,但可以在 docker 容器中运行所有内容,同时能够在所述容器中重新启动节点进程,而无需重新启动容器本身。更改 Dockerfile 不是我的选择,我想使用ENTRYPOINT.
编辑:
Dockerfile
FROM mhart/alpine-node:4.4.7
# add curl and bash
RUN apk add --update curl bash
#Add user
RUN addgroup websites && adduser -s /bin/bash -D -G websites user-api
#Copy app
WORKDIR /srv/app
ADD src ./src/
ADD node_modules ./node_modules
#Expose port
EXPOSE 3000
ENTRYPOINT ["node", "src/start.js"]
Run Code Online (Sandbox Code Playgroud)
构建图像
docker build -t app .
Run Code Online (Sandbox Code Playgroud)
在我的工作站上运行容器
docker run -dit -p 53017:3000 --name app -v c:/Users/hesxenon/Projects/app:/srv/app app:latest
Run Code Online (Sandbox Code Playgroud)
尝试在 Node.js 中处理SIGTERM和信号。SIGINT
Adocker stop并将docker restarta 发送SIGTERM到您的进程。如果没有SIGTERM处理程序,docker 将等待默认的 10 秒超时,直到它发送 aSIGKILL并且您的进程重新启动。这可能是重启延迟的主要部分。
当您处理信号时,ctrl-也会c发送一个SIGINTso 句柄。
process.on('SIGTERM', function () {
console.log('SIGTERM');
process.exit(0);
}
process.on('SIGINT', function () {
console.log('SIGINT');
process.exit(0);
}
Run Code Online (Sandbox Code Playgroud)
以下是有关容器在您启动的进程之上所需的开销的一些信息。它非常小,所以快速测试一下:
docker@default-docker:~$ time true
real 0m 0.00s
user 0m 0.00s
sys 0m 0.00s
docker@default-docker:~$ time docker run busybox true
real 0m 0.64s
user 0m 0.01s
sys 0m 0.00s
Run Code Online (Sandbox Code Playgroud)
因此,与普通进程相比,我笔记本电脑上的虚拟机在容器中启动进程所需的时间大约长 0.64 秒。
| 归档时间: |
|
| 查看次数: |
9833 次 |
| 最近记录: |