如何添加 docker 健康检查来测试 tcp 端口是否打开?

Pav*_*thi 6 docker

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

HEALTHCHECK CMD http://127.0.0.1:9083 || exit 1 #  this check fails
Run Code Online (Sandbox Code Playgroud)

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

到目前为止,我尝试了以下选项,但没有一个适合作为健康检查。

netstat -an | grep 9083 | grep LISTEN | echo $?  # This works
netstat -an | grep 9084 | grep LISTEN | echo $? # but so does this
Run Code Online (Sandbox Code Playgroud)

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

因为当我这样做时,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 
Run Code Online (Sandbox Code Playgroud)

Pio*_*yna 10

它的较短版本:

netstat -ltn | grep -c 9083
Run Code Online (Sandbox Code Playgroud)

使用的选项:

网络统计

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

grep

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


Alf*_*yum 8

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

HEALTHCHECK CMD netstat -an | grep 9083 > /dev/null; if [ 0 != $? ]; then exit 1; fi;
Run Code Online (Sandbox Code Playgroud)


Was*_*hif 5

您可以使用 /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