wget --spiderは404では失敗しますが、--spiderなしでは動作します。

wget --spiderは404では失敗しますが、--spiderなしでは動作します。

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に追加すると、Wgetは代わりに要求を--spider送信します。特にこの特別な場合にはさらにそうです。HEADGETいいえWget呼び出しを使用してください--recursive

RFC 7231セクション4.3.2によると、要求はメッセージ本文を含まないことを除いて、HEAD要求と同じです。GETしかし、あなたの場合、サーバーはaHEADとaの要求に対してGET異なる応答を返すようです。私はそれをサーバーのバグと呼びたいです。スパイダーなしで単に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

関連情報