「あの人も読んでる」略して「も読」。さまざまな寄稿者が最近気になった情報や話題をシェアする企画です。他のテックな人たちがどんな情報を追っているのか、ちょっと覗いてみませんか?
みなさんこんにちは。
「あの人も読んでる」、第6回目の投稿です。maguro (X @yusuktan)がお届けします。
今回のテーマ: DockerなどのコンテナにおけるSIGTERMの取り扱い
現代において開発環境・本番環境問わず無くてはならない基幹技術であるコンテナ。多くの方がDockerfileを書いた・読んだ経験があることと思います。
そんなコンテナ技術ですが、細かいところまで挙動を把握して利用できているでしょうか?僕の答えはNoです。
コンテナを支える裏側の技術(Linuxのnamespaces, cgroupsなど)についてかなり大雑把な理解をしつつ、なんとなく既存のDockerfileを参考にして真似して書いてみたりして、とりあえず意図通り動いてそうであればOKとしていることが結構ありました。
そんな中、以下の動画を見て大変おもしろかったのでご紹介しようと思います。
DockerfileのCMD深堀り解説:CMDを完全に理解している人いない説
この動画は、Dockerfile における CMD
命令の挙動を、プロセスの親子関係やシグナル伝播の観点から詳細に解説しています。
シェル形式(CMD node server.js
)とexec形式(CMD ["node", "server.js"]
)の違いを通じて、どのプロセスが PID 1 として起動するか、それがSIGTERM(docker stop
したときにコンテナ内の PID=1 なプロセスにSIGTERMが送られる)をどう扱うかに焦点を当てています。この2つの形式で具体的にどう変わるのか、ご存知でしょうか?
SIGTERMが意図通りプロセスに伝わらないと、Graceful Shutdownができず問題になるケースもあります。Graceful Shutdownが必要ないケースでも、単純にSIGTERMが伝わらないことでコンテナの終了が遅れることになり、結果としてデプロイの遅れという形で顕在化する可能性もあります。
動画ではさらに、CMD ["npm", "run", "start"]
のように npm run
経由の起動だとどうなるか?という点にも踏み込んでいます。この場合、コンテナ内のプロセスツリーはどうなるのか?SIGTERMはアプリケーションコードに伝搬されるのか?といった点が解説されていきます。
さらにややこしい話として、ベースイメージにDebian系を使うかそれ以外(Alpineなど)を使うかで /bin/sh
の実体が変わり、それによる sh -c
の挙動の差が出てくることも紹介されています。個人的にはDebian系のイメージをよく使いますが、プロセスツリーを複雑化させるという観点だけで見ると、Debian系のほうが「厄介」な挙動なんだな、というのが意外に感じました。
この動画を見たあと、仕事で使っているリポジトリのDockerfileがどうなっているのか気になって真っ先に見に行ってしまいました。そうすると、以下のように tini
というコマンドでラップされていました。
ENTRYPOINT ["/tini", "--", "/my-awesome-program"]
動画では言及されていなかったのですが、この tini
はコンテナ向けのinitプログラムとして設計されており、シグナルの伝搬やゾンビプロセスの刈り取りをよしなにやってくれるとのことで、基本的にこれでラップするのがベストプラクティスのようです。Docker公式のFAQでも以下のように紹介されています。
wrap the application in a lightweight init system (like s6) or a signal proxy (like dumb-init or tini). Either of these wrappers takes care of handling
SIGTERM
properly.
(和訳) アプリケーションを(s6のような)軽量なinitシステムや(dumb-initやtiniのような)シグナルプロキシでラップしてください。これらのラッパーが、SIGTERMを適切に処理してくれます。
おわりに
前回に引き続き動画系のコンテンツをご紹介しました。
内容について少しだけまとめましたが、動画で見ると構成もおもしろくどんどん先が気になる展開になっているので、ぜひご覧いただければと思います。普段なんとなくでやっていた部分について深堀りすると勉強になるなと感じました。
また次回、おすすめコンテンツを紹介していきます。お楽しみに!
maguroさんの「も読」過去記事
- ライブコーディング視聴のすすめ(5月19日公開)
- 生成AIを使うか、使われるか - 学習を加速するための活用(5月8日公開)
- Rustの学習の難しさと取るべきルート(4月17日公開)
- MCPことはじめ / MCPサーバーのセキュリティリスク(4月4日公開)
- n月刊ラムダノート、実用Raft(3月21日公開)