事の始まり
Docker-composeでDjango、MySQL、Nginxを構成し、Amazon Linux 2にデプロイした。
httpでの接続確認もとれ、喜んでいたところDjangoプロジェクト直下のディレクトリ(manage.py が配置されているディレクトリ)にcore.[番号]ファイルが次々に作成されていることに気づく。どうやらDjangoアプリが動く度に出力されるようで、1つのファイルサイズが約50MB...!
これは無視するとまずいと思い調査を開始した。
こいつのせいで土日がまる潰れになることも知らずに...
結果
coreファイルが出力される根本原因は今だ不明だが、
coreファイルが出力されないように設定することはできた。
それには、docker-compose.yml内でulimitを定義する必要がある。
/etc/sysconfig/dockerを設定する方法もあるようだが、私の環境では効果がなかった。
参考サイト:コンテナのulimit値の設定
python:
build: ./python
command: uwsgi --socket :9999 --module project.wsgi --py-autoreload 1 --logto /tmp/mylog.log
volumes:
- ./src:/code
- ./src/blog/static:/static
expose:
- "9999
depends_on:
- db
ulimits:
core:
soft: 0
hard: 0
今回対象の設定はdocker-compose.ymlの最後の方に記載しているulimits:以下の設定である。
意味的にはCentOSで/etc/security/limits.conf に設定する内容と同じ。
こちらを設定し、docker-composeを再起動すればcoreファイルの出力は止まる。
coreって何のファイル?
Linux、Unixプロセスが異常終了した際に生成されるファイル。core dumともいう。
メモリの内容を丸ごと記憶しており、サイズが大きい。
Linuxでは ulimit -c 0 コマンドを実行すれば、coreファイルの出力を止めることができるそうだが、今回は別途docker-composeに設定が必要であったため、効果はなかった。
開発環境(Mac)ではcoreファイルが生成されていなかったため、Amazon Linux 2が原因かと思っていたが、そうではなかった。Dockerは奥が深い。