Я настроил новую команду docker HEALTHCHECK
для контейнера узла / express следующим образом
HEALTHCHECK --interval=5m --timeout=5s \
CMD $ROOT_APPLICATION/healthcheck.sh localhost $PORT || exit 1
, где сценарий healthcheck.sh
выполняет следующее
function healthcheck () {
pt=$2
port=${pt:-"3000"}
RES=$(curl -s http://$1:$2/status | jq '.status.online')
if [ "$RES" == "true" ]; then
return 0
else
return 1
fi
}
healthcheck $@
Узел API /status
возвращает json
следующим образом
{
"status":
{
"online": true
}
}
Я уверен, что проверка работоспособности верна, поскольку внутри контейнера я могу сделать
# $ROOT_APPLICATION/healthcheck.sh localhost $PORT
# status=$?
# [ $status -eq 0 ] && echo "success" || echo "failed"
success
Также вручную вызывая конечную точку проверки работоспособности:
# curl -s http://localhost:3000/ws/1.0/status| jq '.status.online'
true
, а если я проверяю состояние контейнера, я получаю состояние unhealthy
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8539fa50a40 my_container "node --max_old_sp..." 35 minutes ago Up 35 minutes (unhealthy) 0.0.0.0:3000-3001->3000-3001/tcp my_image
[ОБНОВЛЕНИЕ]
Вот вывод docker container inspect
"FinishedAt": "0001-01-01T00:00:00Z",
"Health": {
"Status": "unhealthy",
"FailingStreak": 9,
"Log": [
{
"Start": "2020-03-25T10:11:17.687207876Z",
"End": "2020-03-25T10:11:17.829283718Z",
"ExitCode": -1,
"Output": "rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused \"invalid environment 'NODE_ID'\"\n"
Чтобы воспроизвести эту проблему, вы должны определить docker-compose
файл yaml с переменной environment
NODE_ID
unassigned:
(минимальный файл yaml)
version: '2'
services:
my_service:
environment:
NODE_ID
NODE_ENV=production