如何添加docker运行状况检查以测试tcp端口是否已打开?

时间:2017-09-22 10:48:26

标签: docker

我有一台服务器在端口9083上运行apache配置单元服务。问题是它不支持http协议(但使用thrift协议)。所以我不能简单地添加

HEALTHCHECK CMD http://127.0.0.1:9083 || exit 1 #  this check fails

我想要的只是检查该端口是否已打开。我在服务器上有netstatcurl,但没有nc

到目前为止,我尝试了以下选项,但它们都不适合作为健康检查。

netstat -an | grep 9083 | grep LISTEN | echo $?  # This works
netstat -an | grep 9084 | grep LISTEN | echo $? # but so does this

我从上面解释的问题是它只是告诉我我的语法是正确的,但没有真正测试该端口是否真的在听

因为当我netstat -an时,我得到以下输出,这清楚地显示只有9083正在收听,而不是9084

Active Internet connections (servers and established) Proto Recv-Q Send-Q Local  Address           Foreign Address         State tcp       0      0 
 0.0.0.0:9083            0.0.0.0:*               LISTEN tcp    0      0 

3 个答案:

答案 0 :(得分:4)

虽然回答了一个老问题,但对于未来的googlers,以下内容对我有用:

HEALTHCHECK CMD netstat -an | grep 9083 > /dev/null; if [ 0 != $? ]; then exit 1; fi;

答案 1 :(得分:2)

您可以使用/dev/tcp

像这样:

printf "GET / HTTP/1.1\n\n" > /dev/tcp/127.0.0.1/9083

有关详情,请查看:http://www.tldp.org/LDP/abs/html/devref1.html#DEVTCP

答案 2 :(得分:0)

它的较短版本:

netstat -ltn | grep -c 9083

使用的选项:

netstat

  • -l - 显示监听服务器套接字
  • -t - 仅显示 TCP 套接字
  • -n - 不解析名称

grep

  • -c - 返回一些已建立的行,但它也提供了一个有用的退出代码; 0 表示找到,1 表示未找到