update.はじめにこの投稿は、Dockerのコンテナ停止時に、コンテナ内でスクリプトを実行する方法を試行錯誤しながらまとめたものです。やるのか職場で「コンテナ停止時にデータのバックアップが取りたい」という要望があったので調べていました。「Volumeを使ってマウントすればいいじゃん」というツッコミはご遠慮ねがいます...。linux/amd64最初にDockerのrun(start)とstopについておさらいdocker-runとDockerfileのCMDの関係dockerサービスはdocker-runの実行時に指定されたイメージのCMDに記述されたコマンドをPID:1としてコンテナ内で実行します。※CMDに書かれた内容を上書きして実行する方法もあります。ドキュメントを参照してください。docker-runで実行されたCMDのプロセスに対してkillを実行することになります。(0)とステータスが表示されます。hogeどうやってdocker-stopでスクリプトを実行するか?ここからが本題です。コンテナ内で実行したいサービスやコマンドをシェルスクリプトにまとめます。/path/to/command/piyo-commandスクリプト内でSIGTERMをtrapします。TERMさらに、スクリプトの最後にsleepを無限ループするように書きます。5doneDockerfileでは作ったシェルスクリプトをCMDで実行するように書きます。-SIGTERMを受け取ります。するとtrapがTERM受け取るように指定されているので、trap内のechoコマンドが実行されます。ACCEPTED.と、docker-logsコマンドから確認ができます。/dev/nullでフォアグラウンドのプロセスを残す例をよく見ますよね。-SIGKILLが実行されるとなります。この場合trapに掛からないので想定した動きになりません。DockerfileのCMDをシェル形式で書いていたCMD命令は複数の書き方があります。最初はこう書いていました。'/hoge.bash'と展開された後で実行されます。するとDockerコンテナ内では下のようになります。PID:1のプロセスに対してSIGTERMを実行しても、/bin/shにはtrapを設定していないので、何も実行されず終わってしまいます。※実際にはPID:5のプロセスが残るので、タイムアウト待ちになります。5sleepの時間がdocker-stopのタイムアウトよりも長かったこれは単なる凡ミスです。100doneとしていました。-SIGKILLが実行されてしまいます。まとめコンテナ停止時にスクリプトを実行する方法についてまとめました。試行錯誤していく過程で、コンテナの開始時と停止時に何が起きているのか少しだけ理解できた気がします。containerを使ったバックアップ方法なども考えていきたいです。upLoginユーザーは見つかりませんでした。