node.js - Docker HEALTHCHECK 在 nodejs express 应用程序中失败
问题描述
我已经HEALTHCHECK
为节点/快递容器设置了新的 docker 命令,如下所示
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
返回ajson
如下
{
"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
(最小的 yaml 文件)
version: '2'
services:
my_service:
environment:
NODE_ID
NODE_ENV=production
解决方案
检查服务会显示运行状况检查的结果(完整的检查也会显示 NODE_ID 变量的问题)。
starting container process caused \"invalid environment 'NODE_ID'\"\n
NODE_ID
提供的 compose 文件中的 unassigned假定您已在运行docker-compose up
ordocker stack deploy
命令的环境中定义了此变量。你可以调整它来给它一个默认值:
version: '2'
services:
my_service:
environment:
NODE_ID=${NODE_ID:-undefined}
NODE_ENV=production
有关该语法的更多详细信息,请参阅https://docs.docker.com/compose/compose-file/#variable-substitution
推荐阅读
- docker - Docker 不会通过 Rider 为我打开页面
- svelte - 类:用于伪类
- python-3.x - tkinter 可滚动框架仅使用鼠标滚轮滚动笔记本中最后添加的页面
- html - 为什么我点击图片标签时不下载它没有下载
- python-3.x - 我正在尝试在 tkinter 上定义一个按钮,但我一直收到错误消息
- reactjs - 在 ReactJs 组件中从 Laravel Api 访问上传图片
- python - Scrapy - NameError:名称“项目”未定义
- php - 如何在 clancats hydrahon update() 中传递空值?
- python - render_to_string 似乎删除了变量的值
- next.js - 如果 NEXTJS 应用程序包含 [id].js 页面,如何在 Google 主机上部署它?