docker execで実行したコンテナ内のプロセスを kill する

インストールがめんどくさいツールを使う時に、 Docker コンテナ立てて exec すれば楽じゃん、と思った。

ところが、 docker exec で実行したプロセスを kill するにはひと手間必要だった。

# コンテナを立てる。
$ docker run -d --name my-ubuntu  ubuntu:16.04 sleep infinity
9f13425de1a53c6976a14e2ca26f0316ace0891e66f27810231e7f9b9c7fcc3a
# コンテナ内で `sleep 10000` コマンドを実行する
$ docker exec my-ubuntu sleep 10000
# Ctrl + C で終了する
^C
# コンテナ内のプロセスを覗くと...
$ docker top my-ubuntu
UID       PID       PPID      C         STIME     TTY  TIME      CMD
root      18785     18768     0         21:08     ?    00:00:00  sleep infinity
root      18891     18875     0         21:09     ?    00:00:00  sleep 10000

プロセスが生きてた…。

# ホストからプロセスをkillできる。ただし sudo で。
$ sudo kill 18891
# プロセスが死んだことを確認
$ docker top my-ubuntu
UID       PID       PPID      C         STIME     TTY       TIME      CMD
root      18785     18768     0         21:08     ?         00:00:00  sleep infinity

ホストから kill するには sudo が必要だが、 docker コンテナ内で kill すれば必要ない。コンテナ内では違った PID が割り当てられている。

# もう一度 exec する
$ docker exec -d my-ubuntu sleep 10000
# コンテナ内で `pidof` する
$ docker exec my-ubuntu pidof -s sleep
13
# コンテナ内で kill する
$ docker exec my-ubuntu kill 13
# プロセスが死んだことを確認
$ docker top my-ubuntu
UID       PID       PPID      C         STIME     TTY       TIME      CMD
root      18785     18768     0         21:08     ?         00:00:00  sleep infinity