Dockerコンテナの終了までの猶予期間を設定する
終了コマンドでシグナルが送られる
Dockerコンテナに対してdocker stop
コマンドを実行するとデフォルトではSIGTERM
が送られた後10秒後にSIGKILL
が送られる。
シグナルを受け取ったタイミングでログを残すNode.jsスクリプトを作成し、
$ <<SCRIPT > main.js
'use strict';
var http = require('http');
var server = http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(80, '0.0.0.0');
console.log('server started');
console.time('server received \`SIGTERM\`');
process.on('SIGTERM', function () {
console.timeEnd('server received \`SIGTERM\`');
});
SCRIPT
Dockerコンテナのエントリポイントで実行して2秒後にdocker stop
コマンドを送ることで確認できる。
$ <<DOCKERFILE > Dockerfile
FROM node
COPY ./main.js ./main.js
ENTRYPOINT ["node", "main"]
DOCKERFILE
$ docker build -t image .
$ { sleep 2 ; docker stop app > /dev/null } & disown ; TIMEFMT="server stopped by \`SIGKILL\`: %E" ; time docker run --rm --name app image
server started
server received `SIGTERM`: 1.809s
server stopped by `SIGKILL`: 12.23s
送信されるシグナルは変更できる
docker stop
で送信されるシグナルはdocker run
のオプション--stop-signal
もしくはdocker-compose.yml
のstop_signal
で変更できる。
$ { sleep 2 ; docker stop app > /dev/null } & disown ; TIMEFMT="server stopped by \`SIGKILL\`: %E" ; time docker run --rm --name app --stop-signal 2 image
server started
server stopped by `SIGKILL`: 12.24s
強制終了までの猶予期間も変更できる
docker stop
でシグナルが送信された後、SIGKILL
が送信されるまでの猶予期間もdocker stop
のオプション--time
もしくはdocker-compose.yml
のstop_grace_period
で変更できる。
$ { sleep 2 ; docker stop -t 2 app > /dev/null } & disown ; TIMEFMT="server stopped by \`SIGKILL\`: %E" ; time docker run --rm --name app image
server started
server received `SIGTERM`: 1.694s
server stopped by `SIGKILL`: 4.22s