7

Docker API イメージの作成/プル (/v1.6/images/create) は明らかに常に返されます

HTTP/1.1 200 OK
Content-Type: application/json

プロセスが成功するか失敗するかは関係ありません。

さらに、ペイロードは有効な json ではありません。

例: /v1.6/images/create?fromImage=whatevertheflush

戻り値:

{"status":"Pulling repository whatevertheflush"}{"error":"Server error: 404 trying to fetch remote history for whatevertheflush","errorDetail":{"code":404,"message":"Server error: 404 trying to fetch remote history for whatevertheflush"}}

有効なjsonではなく、HTTPエラーが転送/使用されていないため、クライアントのエラーを処理するのが面倒です.

実際、docker-py はペイロードを吐くだけです ( https://github.com/dotcloud/docker-py/blob/master/docker/client.py#L374 )。そして、openstack の DockerHTTPClient は、常に 200 である http エラー コードに基づいて値を返そうとします... ( https://github.com/openstack/nova/blob/master/nova/virt/docker/client.py# L191 )

さて、プルには長い時間がかかる可能性があり、クライアントへの回答のストリーミングを開始することはある程度理にかなっていることを理解していますが、ここで何かがおかしいと思わずにはいられません.

したがって、これは 3 つの折り方です。

  • ここで何かが完全に欠けていますか?
  • そうでない場合: クライアント アプリケーションを (たとえば、Python で) 実装している場合、これをどのように処理しますか (可能であればエレガントに:))? 有効なjsonブロックを検出してロードし、何かがおかしいと「思う」たびに終了しようとしますか?
  • そうでない場合: これは将来の docker バージョンで (より良い方向に) 変更されますか?
4

3 に答える 3

0

この特定のエンドポイントは、実際にはチャンク エンコーディングを返します。curl による例:

$ curl -v -X POST http://localhost:4243/images/create?fromImage=base
* About to connect() to localhost port 4243 (#0)
*   Trying ::1...
* Connection refused
*   Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 4243 (#0)
> POST /images/create?fromImage=base HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.5
> Host: localhost:4243
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Fri, 07 Feb 2014 04:21:59 GMT
< Transfer-Encoding: chunked
<
* Connection #0 to host localhost left intact
{"status":"Pulling repository base"}{"status":"Pulling image (ubuntu-quantl) from      base","progressDetail":{},"id":"b750fe79269d"}{"status":"Pulling image (ubuntu-quantl) from base, endpoint: https://cdn-registry-1.docker.io/v1/","progressDetail":{},"id":"b750fe79269d"}{"status":"Pulling dependent layers","progressDetail":{},"id":"b750fe79269d"}{"status":"Download complete","progressDetail":{},"id":"27cf78414709"}{"status":"Download complete","progressDetail":{},"id":"b750fe79269d"}{"status":"Download complete","progressDetail":{},"id":"b750fe79269d"}* Closing connection #0

これを Python でどのように解析するのかわかりませんが、Ruby では次のようにYajlを使用できます。

parts = []
Yajl::Parser.parse(body) { |o| parts << o }
puts parts
{"status"=>"Pulling repository base"}
{"status"=>"Pulling image (ubuntu-quantl) from base", "progressDetail"=>{}, "id"=>"b750fe79269d"}
{"status"=>"Pulling image (ubuntu-quantl) from base, endpoint: https://cdn-registry-1.docker.io/v1/", "progressDetail"=>{}, "id"=>"b750fe79269d"}
{"status"=>"Pulling dependent layers", "progressDetail"=>{}, "id"=>"b750fe79269d"}
{"status"=>"Download complete", "progressDetail"=>{}, "id"=>"27cf78414709"}
{"status"=>"Download complete", "progressDetail"=>{}, "id"=>"b750fe79269d"}
{"status"=>"Download complete", "progressDetail"=>{}, "id"=>"b750fe79269d"}
于 2014-02-07T04:31:06.440 に答える
0

Docker v1.9 を使用すると、まだこの問題に対処する必要があります。また、Docker Github リポジトリで問題が見つかりました: Docker は一部の API 関数で無効な JSON 形式を使用しています #16925

一部の貢献者がContent-Type次のような HTTP ヘッダーを使用することを提案している場合:application/json; boundary=NL これは私にとってはうまくいきませんでした。

次に、カスタム パーサーと格闘しているときに、StackOverflow: How to handle a huge stream of JSON dictionaries?という質問を見つけました。

于 2016-02-08T15:44:22.517 に答える