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
送信します。特にこの特別な場合にはさらにそうです。HEAD
GET
いいえ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