私のdockerエッセイ24:dockerはcoredumpファイルを生成します


dockerコンテナでC++プログラムを実行し、クラッシュすることがありますが、ログもプロンプトもありません.以前coredumpデバッグを把握していましたが、コンテナで試してみました.
操作
まずcoreサイズを表示します.
$ ulimit -a | grep core
core file size          (blocks, -c) 0

設定:
$ulimit -c unlimited

再表示:
$ ulimit -a | grep core
core file size          (blocks, -c) unlimited

パスの設定
$ sudo echo 'core.%t.%e.%p' | sudo tee /proc/sys/kernel/core_pattern

ミラーの実行:
docker run -v /home:/home  -it latelee/myserver bash

対応するプログラムディレクトリに入ります.
# cd /home/latelee/docker/test/myserver/

エラーのあるテストプログラムを実行します.
# ./myserver
Segmentation fault (core dumped)

生成するかどうかを確認します.
# ls
Dockerfile  core.1535079291.myserver.11  entrypoint.sh  config.ini  myserver

生成されたcoredumpファイルはcore.1535079291.myserver.11です.
core設定が永続的に有効/etc/security/limits.confファイルを編集し、core関連の構成項目を以下のように変更します.
*               soft    core            unlimited
root            hard    core            unlimited

/etc/sysctlを編集します.confファイル、ファイルの最後に追加:
kernel.core_pattern = core.%t.%e.%p

注意:以上の2つのファイルはroot権限で開く必要があります.
小結
0、プログラムは-gコンパイルを使用する必要があります.すなわち、プログラムはデバッグ情報を持っています.そうしないと、coredumpがあっても問題は見えません.1.まず、ulimit -c unlimitedをシンクホスト上で実行し、coredumpを生成するパスを設定する.2、dockerコンテナでプログラムを実行します.
経験
1、ネット上ではdocker runの時に--ulimit core=-1 --security-opt seccomp=unconfinedのパラメータを持っていて、経験証があって、持っていなくてもcoredumpファイルを生成することができます.筆者は一般的にdocker-composeを用いて容器を編成しているが,これはまだdocker-compose.yml文書にどのように書くか分からないので,しばらく使用しない.2、coredumpファイルパスの設定については、/tmpまたは単独でマウントするディレクトリを推奨します.上記はプレゼンテーションのみで、実際の指導的な意味はありません.