我希望能够在Docker容器中运行Node,并能运行
以下是一个测试Dockerfile:
这是Dockerfile中提到的
我这样构建它:
我这样运行它:
docker stop <container>
命令。这将在SIGTERM
上停止容器,而不是超时并执行SIGKILL
。不幸的是,我似乎缺少某些内容,而我发现的信息似乎与其他部分相矛盾。以下是一个测试Dockerfile:
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y curl
RUN curl -sSL http://nodejs.org/dist/v0.11.14/node-v0.11.14-linux-x64.tar.gz | tar -xzf -
ADD test.js /
ENTRYPOINT ["/node-v0.11.14-linux-x64/bin/node", "/test.js"]
这是Dockerfile中提到的
test.js
文件:var http = require('http');
var server = http.createServer(function (req, res) {
console.log('exiting');
process.exit(0);
}).listen(3333, function (err) {
console.log('pid is ' + process.pid)
});
我这样构建它:
我这样构建它:
$ docker build -t test .
我这样运行它:
我这样运行它:
$ docker run --name test -p 3333:3333 -d test
然后我运行:
$ docker stop test
当使用SIGTERM
时,应用程序似乎无法正常终止,导致10秒后超时并死亡。
我发现如果通过sh -c
启动节点任务,则可以从交互式(-it
)容器中使用^C
来杀掉它,但我仍然无法让docker stop
起作用。这与我读到的评论相矛盾,说sh
不传递信号,但可能与我读到的其他评论一致,即PID 1不会收到SIGTERM
(因为它是通过sh
启动的,所以它将是PID 2)。
最终目标是能够在upstart作业中运行docker start -a ...
并能够停止服务,并实际退出容器。
docker stop
usesSIGTERM
. I added that piece of code both forSIGINT
andSIGTERM
- xonyaSIGINT
没有任何效果,而使用SIGTERM
可以帮助终止进程。 - Matteo