docker撰写健康检查问题

时间:2018-03-10 10:57:33

标签: bash shell docker docker-compose health-monitoring

在我的docker-compose.yml(版本-2.3)中,我已经为几项服务设置了健康检查。这是相关的yml片段 -

      healthcheck:
        test: ["CMD-SHELL", "/secrets/authz_Startup.sh"]
        interval: 30s
        timeout: 30s
        retries: 3
        start_period: 300s 

这是我的authz_Startup.sh内容 -

#!/bin/bash
HTTP_STATUS="$(curl -IL --silent https://myHost.com/authz/ping 2>/dev/null | head -n 1 | cut -d ' ' -f 2)";
if [ "$HTTP_STATUS" = "200" ]; then
    echo "Service started";
    exit 0;
else
    echo "***Service NOT started*** --> $HTTP_STATUS";  
    exit 1;
fi
exit;

然而,当我运行“docker-compose up”然后使用“docker inspect --format ='{{json .State.Health}}'CONTAINER_ID | jq”检查运行状况检查输出时,我总是得到 - < / p>

{
  "Status": "unhealthy",
  "FailingStreak": 16,
  "Log": [
    {
      "Start": "2018-03-10T16:05:18.361126144+05:30",
      "End": "2018-03-10T16:05:18.668852098+05:30",
      "ExitCode": 1,
      "Output": "***Service NOT started*** --> \n"
    },
    {
      "Start": "2018-03-10T16:05:48.676933885+05:30",
      "End": "2018-03-10T16:05:48.973643139+05:30",
      "ExitCode": 1,
      "Output": "***Service NOT started*** --> \n"
    }
  ]
}

然而,我可以从终端运行此脚本并获得“Service started”消息。当我从浏览器请求ping url并且典型响应时间以ms为单位时,我也能看到“200 OK”响应。此外,在服务被宣布为“不健康”之前,我能够在浏览器上看到200响应。

我在我的智慧结束时试图找出我做得不对的任何事情。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

想出这个 - &gt; 在我的设置中,我有4个docker容器在端口8080上运行tomcat服务器并映射到端口(9000,9001,9002和9003)以及在我的ubuntu(v16.04)服务器上的端口443上运行的Apache Webserver。 Apache有一个反向代理,配置为将请求转发到各个docker容器。这部分工作正常。例如。 - 我向apache webserver(https://myHost.com/authz/ping)发出请求,请求转发到单个docker容器(http://myHost.com:9000/authz/ping)。

但是,当我试图提出此请求时,healthcheck apis在docker容器中运行,而且所有这些都是&gt; https://myHost.com/authz/ping但是docker容器无法连接到主机上运行的Apache Web服务器,这就是它失败的原因。

我将健康检查网址更改为http://localhost:9000/authz/ping,它开始正常工作。 所以,这个位现在已经排序了,但是我仍然需要找到一些方法来从docker容器中创建服务,发现在主机上运行的服务。