Docker 重启入口点

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)

Mat*_*att 2

尝试在 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 的开销

以下是有关容器在您启动的进程之上所需的开销的一些信息。它非常小,所以快速测试一下:

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 秒。