docker 撰写健康检查问题

docker compose healthcheck issue

在我的 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" 检查健康检查输出时,我总是得到 -

{
  "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 并且典型的响应时间以毫秒为单位时,我也能够看到“200 OK”响应。此外,在声明服务 "unhealthy" 之前,我能够在我的浏览器上看到 200 响应。

我无计可施,试图找出我做错了什么。有人可以帮我解决这个问题吗?

想通了 --> 在我的设置中,我在端口 8080 上有 4 个 docker 容器 运行ning tomcat 服务器并映射到端口(9000、9001、9002 和 9003)和一个 Apache Web 服务器 运行在我的 ubuntu (v16.04) 服务器上的端口 443 上 ning。 Apache 有一个配置为将请求转发到单个 docker 容器的反向代理。这部分工作正常。例如。 - 我向 apache 网络服务器发出请求 (https://myHost.com/authz/ping) and the request forwards to the individual docker container (http://myHost.com:9000/authz/ping)。

但是,docker 容器中的 healthcheck api 运行 以及所有这一切,同时我试图发出此请求 --> https://myHost.com/authz/ping 但 docker 容器是无法连接到主机上的 Apache 网络服务器 运行ning,这就是它失败的原因。

我将健康检查 url 更改为 http://localhost:9000/authz/ping,它开始正常工作。 所以,这个位现在已经排序,但我仍然需要想出一些方法来从 docker 容器内提供服务,在主机上发现服务 运行ning。