Ich möchte Knoten in einem Andock-Container ausführen können, und dann docker stop <container>
ausführen können. Dies sollte den Container auf statt Timing-out stoppen und eine SIGKILL
tun. Leider scheint mir etwas zu fehlen, und die Informationen, die ich gefunden habe, scheinen anderen Bits zu widersprechen.Docker-Stopp funktioniert nicht für Node-Prozess
Hier ist ein Test 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"]
Hier ist die test.js
im Dockerfile genannt:
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)
});
Ich baue es etwa so:
$ docker build -t test .
ich es laufen so:
$ docker run --name test -p 3333:3333 -d test
Dann laufe ich:
$ docker stop test
Woraufhin die SIGTERM
anscheinend nicht funktioniert, so dass es nach 10 Sekunden Timeout und dann sterben.
Ich habe festgestellt, dass, wenn ich den Knoten Aufgabe durch sh -c
dann fange ich es mit ^C
von einem interaktiven (-it
) Behälter töten kann, aber ich kann immer noch nicht docker stop
zu arbeiten. Dies widerspricht den Kommentaren, die ich gelesen habe, dass sh
das Signal nicht weitergibt, aber vielleicht mit anderen Kommentaren übereinstimmt, die ich gelesen habe, dass PID 1 nicht SIGTERM
bekommt (seit es über sh
gestartet wurde, wird es PID sein 2).
Das Endziel ist es, docker start -a ...
in einem Upstart-Auftrag ausführen und in der Lage sein, den Dienst zu stoppen, und es tatsächlich den Container verlässt.