Подтвердить что ты не робот

Как узнать причину закрытия контейнера докеров?

У меня есть Docker-контейнер, работающий на хосте 1G RAM (есть и другие контейнеры, работающие на том же хосте). Приложение в этом контейнере Docker будет декодировать некоторые изображения, которые могут потреблять много памяти.

Время от времени этот контейнер будет выходить. Я сомневаюсь, что это связано с нехваткой памяти, но не очень уверен. Мне нужен метод, чтобы найти причину. Так есть ли способ узнать, что случилось с этой смертью контейнера?

4b9b3361

Ответ 1

Другие упоминали docker logs $container_id для просмотра выходных данных приложения. Это всегда будет моей первой проверкой.

Затем вы можете запустить docker inspect $container_id чтобы просмотреть подробную информацию о состоянии, например:

    "State": {
        "Status": "exited",
        "Running": false,
        "Paused": false,
        "Restarting": false,
        "OOMKilled": false,
        "Dead": false,
        "Pid": 0,
        "ExitCode": 2,
        "Error": "",
        "StartedAt": "2016-06-28T21:26:53.477229071Z",
        "FinishedAt": "2016-06-28T21:26:53.478066987Z"
    },

Важной строкой является "OOMKilled", которое будет истинным, если вы превысите пределы памяти контейнера и Docker убьет ваше приложение. Вы также можете посмотреть код выхода, чтобы узнать, определяет ли он причину выхода для вашего приложения.

Обратите внимание, это только указывает на то, что docker сам убивает ваш процесс, и требует, чтобы вы установили ограничение памяти для вашего контейнера. Вне докера ядро Linux может остановить ваш процесс, если самому хосту не хватит памяти. Linux часто пишет в журнал в /var/log, когда это происходит. С помощью Docker Desktop на Windows и Mac вы можете настроить память, выделенную для встроенной виртуальной машины Linux, в настройках докера.

Ответ 2

Вы можете узнать, был ли OOMkill уничтожен процесс внутри контейнера, прочитав логи. OOMkills инициируется ядром, поэтому каждый раз, когда это происходит, в /var/log/kern.log появляется куча строк, например:

python invoked oom-killer: gfp_mask=0x14000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=995
oom_kill_process+0x22e/0x450
Memory cgroup out of memory: Kill process 31204 (python) score 1994 or sacrifice child
Killed process 31204 (python) total-vm:7350860kB, anon-rss:4182920kB, file-rss:2356kB, shmem-rss:0kB