SSHが切断させるとdocker processが残る件について

  • このエントリーをはてなブックマークに追加

SSH Loginしたサーバ上でdocker runでプロセスを動かしている時に、sshのconnectionが切れるとdocker processが動きっぱなしになる現象が発生しました。

具体的には次のような感じです。

1
2
3
4
5
6
7
8
9
10
ssh server

[on server]
bash hoge.sh

[hoge.sh]
docker run --rm -it xxx ruby fuga.rb

[fuga.rb]
loop { sleep 1 }

通常であればsshが切断されると全てのプロセスが終了するはずですが、何故かdocker processが残ってしましました。これは、次のようにdocker runの実際のプロセスがdockerdの下にぶら下がっているからだと思います。hoge.shは終了しますが、docker-containerd-shimのtreeの方は終了しません。fuga.rbの方にはシグナルは何も飛んできませんでした。

1
2
3
4
5
6
7
8
9
ssh
bash
hoge.sh
docker run ...

/usr/bin/dockerd
docker-containerd
docker-containerd-shim
ruby fuga.rb

特殊なシグナルは飛びませんがhoge.sh自体は終了するので、hoge.shに次のコードを仕込んで解決しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cidfile="$(mktemp --dry-run "/tmp/nodelist.tmp.XXXXXXXXXX")"
function on_exit() {
if [ -f "${cidfile}" ]; then
cid="$(cat ${cidfile})"
if [ -z "${cid}" ]; then
return
fi
docker inspect ${cid} 2>/dev/null 1>/dev/null
if [ $? -eq 0 ]; then
docker kill ${cid} -s QUIT
fi
rm -f "${cidfile}"
fi
}

trap "on_exit" EXIT
1
docker run --rm -it --cidfile="${cidfile}" xxx ruby fuga.rb

trapしなくても普通にdocker runの後のexit codeを見ても良かったかな 🤔