我希望能夠在碼頭集裝箱內運行節點,然後能夠運行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
啓動節點任務,然後我可以^C
從交互式(-it
)容器殺死它,但我仍然不能得到docker stop
工作。這與我所讀的sh
沒有傳遞信號的評論相矛盾,但可能與我讀過的其他評論一致認爲PID 1沒有得到SIGTERM
(因爲它是通過sh
開始的,它將是PID 2)。
最終目標是能夠在暴發性的工作中運行docker start -a ...
並能夠停止服務,並且它實際上退出容器。