2013-10-15 11 views
5

डोकर एपीआई छवि निर्माण/पुल (/v1.6/images/create) जाहिरा तौर पर हमेशाडॉकर एपीआई/छवियों/निर्माण को कैसे संभालें?

HTTP/1.1 200 OK 
Content-Type: application/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 त्रुटि अग्रेषित नहीं हो रहा/इस्तेमाल किया इसे संभाल करने के लिए अजीब बना देता है ग्राहकों के लिए त्रुटियां।

वास्तव में, डॉकर-पीई बस पेलोड को प्यूक करें (https://github.com/dotcloud/docker-py/blob/master/docker/client.py#L374)। और ओपनस्टैक से डॉकर एचटीटीपी क्लाइंट http त्रुटि कोड के आधार पर एक मान वापस करने का प्रयास करता है, जो हमेशा 200 होता है ... (https://github.com/openstack/nova/blob/master/nova/virt/docker/client.py#L191)

अब, मुझे समझ में आता है कि खींचने में काफी समय लग सकता है, और यह कुछ हद तक शुरू करने के लिए समझ में आता है क्लाइंट के जवाब को स्ट्रीम करना, लेकिन मैं यहां कुछ गलत सोचने में मदद नहीं कर सकता।

  • मैं पूरी तरह यहाँ कुछ याद आ रही है:

    तो, यह तीन गुना है?

  • यदि नहीं: यदि आप क्लाइंट एप्लिकेशन को लागू कर रहे हैं (कहें, पायथन में), तो आप इसे कैसे संभालेंगे (सुंदर, यदि संभव हो तो :))? जब भी हम "सोचते हैं" कुछ गलत है, तो वैध जेसन ब्लॉक का पता लगाने, उन्हें लोड करने और बाहर निकलने का प्रयास करें?
  • यदि नहीं: तो क्या यह भविष्य के डॉकर संस्करणों में (बेहतर के लिए) बदलने जा रहा है?

उत्तर

0

यह विशेष अंतराल वास्तव में खंडित एन्कोडिंग देता है। कर्ल के माध्यम से एक उदाहरण:

$ 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 

अब मुझे यकीन है कि तुम कैसे पायथन में यह पार्स करने के बारे में जाना नहीं कर रहा हूँ, लेकिन रूबी में, मैं इतना की तरह 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"} 
+0

खैर, यह न केवल एन्कोडिंग chunked है, यह भी json का हिस्सा है - वास्तव में, मैं समाप्त हो गया-अप के रूप में अच्छी तरह से अजगर में एक पार्सर लेखन। हालांकि उत्तर के लिए धन्यवाद। –

0

डोकर v1.9 का उपयोग करना मुझे अभी भी इस समस्या का सामना करने के लिए समस्या है। application/json; boundary=NL यह मेरे लिए काम नहीं किया: Docker uses invalid JSON format in some API functions #16925

कहाँ कुछ योगदानकर्ता इस तरह Content-Type HTTP शीर्ष लेख का उपयोग करने का सुझाव देते हैं: इसके अलावा डोकर Github रिपॉजिटरी पर एक मुद्दा मिल गया है। How to handle a huge stream of JSON dictionaries?

0

निम्न प्रक्रिया डोकर एपीआई के माध्यम से एक छवि का निर्माण होगा:

फिर, अपने कस्टम पार्सर के साथ संघर्ष कर, जबकि, इस सवाल StackOverflow पाया।

नमूना Dockerfile:

# cat Dockerfile 

FROM ubuntu:14.04 
RUN mkdir demo 
RUN apt-get update 
RUN apt-get -y install vim 

टार फ़ाइल में आपका Dockerfile शामिल बनाएँ।

# tar -cvf Dockerfile.tar.gz Dockerfile 

एपीआई को नीचे और अधिक विकल्पों के लिए निष्पादित करें, इसे देखें।

# curl -v -X POST -H "Content-Type:application/tar" --data-binary '@Dockerfile.tar.gz' http://127.0.0.1:5000/build?t=build_test 

# docker images 
REPOSITORY      TAG     IMAGE ID   CREATED    SIZE 
build_test      latest    b1736dd9b698  8 seconds ago 

इस संदर्भ लें:

how to configure docker daemon port

संबंधित मुद्दे