Контейнер-докер со статусом "Мертвый" после запуска программы consul healthcheck
Я использую функцию consul healthcheck, и я продолжаю получать эти "мертвые" контейнеры:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20fd397ba638 progrium/consul:latest "\"/bin/bash -c 'cur 15 minutes ago Dead
Что такое "мертвый" контейнер? Когда остановленный контейнер становится "мертвым"?
Для записи я запускаю образы progrium/consul + gliderlabs/registrator + SERVICE_XXXX_CHECK env для проверки работоспособности. Он запускает проверку работоспособности script, запуская изображение каждые X секунд, что-то вроде docker run --rm my/img healthcheck.sh
Меня интересует вообще то, что означает "мертвый" и как предотвратить его. Еще одна особенность заключается в том, что у моих мертвых контейнеров нет имени.
это информация из проверки контейнера:
"State": {
"Dead": true,
"Error": "",
"ExitCode": 1,
"FinishedAt": "2015-05-30T19:00:01.814291614Z",
"OOMKilled": false,
"Paused": false,
"Pid": 0,
"Restarting": false,
"Running": false,
"StartedAt": "2015-05-30T18:59:51.739464262Z"
},
Странно то, что только время от времени контейнер становится мертвым и не удаляется.
Спасибо
Изменить:
Глядя на журналы, я обнаружил, что делает остановку контейнера неудачной:
Handler for DELETE /containers/{name:.*} returned error: Cannot destroy container 003876e41429013e46187ebcf6acce1486bc5011435c610bd163b159ba550fbc:
Driver aufs failed to remove root filesystem 003876e41429013e46187ebcf6acce1486bc5011435c610bd163b159ba550fbc:
rename /var/lib/docker/aufs/diff/003876e41429013e46187ebcf6acce1486bc5011435c610bd163b159ba550fbc
/var/lib/docker/aufs/ diff/003876e41429013e46187ebcf6acce1486bc5011435c610bd163b159ba550fbc-removing:
device or resource busy
Почему это происходит?
edit2:
нашел это: https://github.com/docker/docker/issues/9665
Ответы
Ответ 1
Обновление в марте 2016 года: проблема 9665 только что была закрыта PR 21107 (для докера 1.11 возможно)
Это должно помочь избежать проблемы с драйвером "aufs", чтобы не удалять корневую файловую систему "," проблема с устройством или ресурсом ".
Оригинальный ответ май 2015 г.
Мертвый - это один, если состояния контейнера, который проверяется Container.Start()
if container.removalInProgress || container.Dead {
return fmt.Errorf("Container is marked for removal and cannot be started.")
}
установить Dead при прекращении остановки, чтобы предотвратить перезапуск этого контейнера.
Среди возможной причины сбоя см. container.Kill()
.
Это означает, что kill -15
и kill -9
не работают.
// 1. Send a SIGTERM
if err := container.killPossiblyDeadProcess(15); err != nil {
logrus.Infof("Failed to send SIGTERM to the process, force killing")
if err := container.killPossiblyDeadProcess(9); err != nil {
Это обычно означает, как упоминает OP, занятое устройство или ресурс, препятствующий уничтожению процесса.
Ответ 2
Есть много ошибок, вызванных EBUSY
, в частности, когда используется devicemapper
.
Существует ошибка отслеживания всех связанных с EBUSY
проблем.
см. https://github.com/docker/docker/issues/5684#issuecomment-69052334