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