我正在尝试在 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 吗?
接受的答案似乎不正确,实际上可以帮助您隐藏 docker 容器中的错误。将
--spider
选项添加到 Wget,将导致 Wget 发送HEAD
请求而不是GET
. 特别是在这种特殊情况下,您没有使用--recursive
.根据 RFC 7231 第 4.3.2 节,
HEAD
请求与请求相同,GET
只是它不包含消息正文。但是,在您的情况下,服务器似乎对 aHEAD
和 aGET
请求返回不同的响应。我将其称为您服务器中的错误。请不要在没有蜘蛛的情况下简单地调用 Wget 并将问题扫到地毯下。这种行为违反了 HTTP 规范,并且将来可能会导致其他问题,因为连接到它的客户端会看到错误的响应。您的 wget 调用
--spider
似乎无法正常工作。它还应该使用HEAD
请求返回 HTTP 200。请参阅darnir 的回答。-O
如果您需要特定的文件名,您可以使用该选项设置设置输出文档,例如或者,如果您不想要任何输出,您可以使用
-O -
将结果打印到 stdout,然后将 stdout/stderr 重定向到/dev/null
.