我正在尝试在 docker 容器中进行健康检查。我发现这个命令:
wget --quiet --tries=1 --spider http://localhost:6077 || exit 1
问题是,当容器运行时,如果我在不带 --spider 的情况下运行 wget,我会得到 HTTP 200 代码,但如果使用 --spider,则会返回 404。
为什么会发生这种情况?
$ wget --tries=1 http://localhost:6077
--2019-04-22 04:20:12-- http://localhost:6077/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:6077... connected.
HTTP request sent, awaiting response... 200 OK
Length: 436 [application/xml]
Saving to: ‘index.html.1’
$ wget --tries=1 --spider http://localhost:6077
Spider mode enabled. Check if remote file exists.
--2019-04-22 04:21:46-- http://localhost:6077/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:6077... connected.
HTTP request sent, awaiting response... 404 Not Found
Remote file does not exist -- broken link!!!
这种奇怪的行为正在破坏我的健康检查,如果我不使用 --spider 我认为 wget 会尝试在某个地方下载index.html,对吧?
答案1
接受的答案似乎是不正确的,实际上可以帮助您隐藏 Docker 容器中的错误。向 Wget添加该--spider
选项将导致 Wget 发送HEAD
请求而不是GET
.尤其是在这种特殊情况下,您所在的位置不是使用 调用 Wget --recursive
。
根据 RFC 7231 第 4.3.2 节,HEAD
请求与请求相同,GET
只是它不包含消息正文。但是,在您的情况下,服务器似乎对 aHEAD
和 aGET
请求返回不同的响应。我将其称为您服务器中的错误。请不要简单地在没有蜘蛛的情况下调用 Wget 并将问题隐藏起来。此行为违反了 HTTP 规范,并且将来可能会导致其他问题,因为连接到它的客户端会看到错误的响应。
答案2
您的 wget 调用似乎--spider
无法正常工作。它还应该使用请求返回 HTTP 200 HEAD
。看达尔尼尔的回答。
如果我不使用 --spider 我假设 wget 会尝试在某个地方下载 index.html 对吧?
-O
如果您需要特定的文件名,您可以使用该选项设置设置输出文档,例如
wget --quiet --tries=1 -O/tmp/docker.html http://localhost:6077
或者,如果您不需要任何输出,可以使用-O -
将结果打印到 stdout,然后将 stdout/stderr 重定向到/dev/null
.
wget -O - http://localhost:6077 &>/dev/null