みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

DockerのCMDは文字列でよいのか

WebサーバーをDockerで作成するために,DockerfileのCMDに以下のように書くことを考えます.

CMD gunicorn --bind 0.0.0.0:8000 web.wsgi

これにより,DockerでWebサーバーを起動すると,問題なくGunicorn - Python WSGI HTTP Server for UNIXが実行されます.

しかし,終了時に問題が発生します.DockerをCtrl+Cで終了させようとしても止まりません.

Gracefully stopping... (press Ctrl+C again to force)

CMDのドキュメントには,以下のように記載されています.

CMD には3つの形式があります。
CMD ["executable","param1","param2"] (exec 形式、この形式が推奨される)
CMD ["param1","param2"] ( ENTRYPOINT のデフォルト・パラメータとして)
CMD command param1 param2 (シェル形式)

Dockerfile リファレンス — Docker-docs-ja 17.06 ドキュメントより

最初のdockerfileでは,Shellを通じてgunicornを起動しているので,Dockerが送信するSIGTERMがgunicornに伝わりません.直接gunicornを起動すればよいので,

CMD ["gunicorn", "--bind 0.0.0.0:8000", "web.wsgi"]

とするべきです.このように実装することで,

Gracefully stopping... (press Ctrl+C again to force)
Stopping docker-compose_web_1      ... done

安全にgunicornを終了することができるようになります.

CMDのドキュメントでexec形式が推奨されているのはシグナルなどを活用するためだと思われます.