2013-10-15 13 views
5

Docker creazione di immagini API/trazione (/v1.6/images/create) a quanto pare sempre tornareCome gestire l'API docker/images/create?

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

non importa se il processo è un successo o un fallimento.

Inoltre, il payload non è valido JSON.

ad esempio: /v1.6/images/create?fromImage=whatevertheflush

rendimenti:

{"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"}} 

Non essendo JSON valido, e l'errore HTTP non vengano inoltrati/usato lo rende scomodo da maneggiare errori per i clienti.

Infatti, docker-py si limita a vomitare il carico utile (https://github.com/dotcloud/docker-py/blob/master/docker/client.py#L374). E DockerHTTPClient da openstack prova a restituire un valore basato sul codice di errore http, che è sempre 200 ... (https://github.com/openstack/nova/blob/master/nova/virt/docker/client.py#L191)

Ora, capisco che il pull potrebbe richiedere molto tempo e che in qualche modo ha senso iniziare trasmettere una risposta al cliente, ma non posso fare a meno di pensare che qui qualcosa non va.

Quindi, questo è tre volte:

  • mi sto perdendo qualcosa di completamente qui?
  • in caso contrario: se si sta implementando un'applicazione client (ad esempio in Python), come gestirli (in modo elegante, se possibile :))? provare a rilevare blocchi JSON validi, caricarli e uscire ogni volta che "pensiamo" che qualcosa non va?
  • in caso contrario: questo cambierà (in meglio) nelle future versioni di finestra mobile?

risposta

0

Questo particolare endpoint restituisce effettivamente la codifica Chunked. Un esempio attraverso ricciolo:

$ 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 

Ora io non sono sicuro di come si va su l'analisi di questo in Python, ma in Ruby, posso usare Yajl in questo modo:

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

Beh, non è solo la codifica chunked, è anche pezzi di JSON - anzi, ho finito-a scrivere un parser in python pure. Grazie per la risposta però. –

0

Utilizzando Docker v1.9 Ho ancora questo problema da affrontare. Inoltre hanno trovato un problema su Docker Github repository: Docker uses invalid JSON format in some API functions #16925

Dove alcuni collaboratore suggerisce di utilizzare Content-Type un'intestazione HTTP come questo: application/json; boundary=NL Questo non ha funzionato per me.

Poi, mentre lotta con il mio parser personalizzato, pensa che questa domanda StackOverflow: How to handle a huge stream of JSON dictionaries?

0

La seguente procedura costruire un'immagine attraverso Docker API.

Dockerfile Esempio:

# cat Dockerfile 

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

creare un file tar che include il Dockerfile.

# tar -cvf Dockerfile.tar.gz Dockerfile 

eseguire l 'API, come di seguito e per più opzioni, vedere questo.

# 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 

consultare questo:

how to configure docker daemon port