2017-02-03 2 views
0

Ich versuche, Docker Bild aus Datei auf Docker Host mit Python Docker API zu erstellen. Der Client läuft auf einem anderen Host. Daher möchte ich vermeiden, dass die Datei auf den Client heruntergeladen und dann auf den Docker-Host hochgeladen wird. Dieser Test:Ist es möglich, ein Bild aus einer Datei auf dem Docker-Host mithilfe der Docker-API zu erstellen?

import docker 
d = docker.from_env() 
print(d.images.client.api.import_image("/data/file.tar", "acme.com/test")) 
print(d.images.client.api.import_image("file:///data/file.tar", "acme.com/test")) 

erzeugt nächste Ausgabe:

{"status":"Downloading from http://%2Fdata%2Ffile.tar"} 
{"errorDetail":{"message":"parse http://%2Fdata%2Ffile.tar: invalid URL escape \"%2F\""},"error":"parse http://%2Fdata%2Ffile.tar: invalid URL escape \"%2F\""} 

{"status":"Downloading from file:///data/file.tar"} 
{"errorDetail":{"message":"Get file:///data/file.tar: unsupported protocol scheme \"file\""},"error":"Get file:///data/file.tar: unsupported protocol scheme \"file\""} 

Docker Daemon 1.13 läuft in Ubuntu 16.04 VM auf ESXi 6-Host. Client ist Docker Python API 2.0.2 auf physischen Windows 10-Host ausgeführt.

Antwort

0

Nachdem bei docker daemon code Suche fand ich heraus, dass Docker nicht lokale Dateien dort nicht unterstützt und immer erwartet http-Antwort von URL.

Also habe ich Datei über HTTP-Server in Docker Container ausgesetzt und http URL senden.

0

Ich habe nicht mit Docker Python-Bibliothek gearbeitet, aber ich schlage vor, Docker API zu verwenden, die Dinge zu tun, mehr Funktionen als andere Art und Weise bestimmt:

Die folgenden Verfahren ein Bild durch Docker bauen API.

Probe Dockerfile:

# cat Dockerfile 

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

eine tar-Datei erstellen, die Ihre Dockerfile enthält.

# tar -cvf Dockerfile.tar.gz Dockerfile 

Führen Sie die Docker API ein Bild

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

* Hostname was NOT found in DNS cache 
* Trying 127.0.0.1... 
* Connected to 127.0.0.1 (127.0.0.1) port 5000 (#0) 
> POST /build?t=build_test HTTP/1.1 
> User-Agent: curl/7.35.0 
> Host: 127.0.0.1:5000 
> Accept: */* 
> Content-Type:application/tar 
> Content-Length: 10240 
> Expect: 100-continue 
> 
< HTTP/1.1 100 Continue 
< HTTP/1.1 200 OK 
< Api-Version: 1.28 
< Content-Type: application/json 
< Docker-Experimental: false 
< Ostype: linux 
* Server Docker/17.04.0-ce (linux) is not blacklisted 
< Server: Docker/17.04.0-ce (linux) 
< Date: Mon, 01 May 2017 09:56:54 GMT 
< Transfer-Encoding: chunked 
< 
{"stream":"Step 1/4 : FROM ubuntu:14.04\n"} 
{"stream":" ---\u003e 302fa07d8117\n"} 
{"stream":"Step 2/4 : RUN mkdir demo\n"} 
{"stream":" ---\u003e Running in 5941f911099e\n"} 
{"stream":" ---\u003e bccbffdd776a\n"} 
{"stream":"Removing intermediate container 5941f911099e\n"} 
{"stream":"Step 3/4 : RUN apt-get update\n"} 
{"stream":" ---\u003e Running in 7aefd190a165\n"} 
{"stream":"Ign http://archive.ubuntu.com trusty InRelease\n"} 
{"stream":"Get:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]\n"} 
{"stream":"Get:2 http://archive.ubuntu.com trusty-security InRelease [65.9 kB]\n"} 
{"stream":"Get:3 http://archive.ubuntu.com trusty Release.gpg [933 B]\n"} 
{"stream":"Get:4 http://archive.ubuntu.com trusty Release [58.5 kB]\n"} 
{"stream":"Get:5 http://archive.ubuntu.com trusty-updates/main Sources [491 kB]\n"} 
{"stream":"Get:6 http://archive.ubuntu.com trusty-updates/restricted Sources [6467 B]\n"} 
{"stream":"Get:7 http://archive.ubuntu.com trusty-updates/universe Sources [226 kB]\n"} 

.......  

{"stream":"Fetched 22.5 MB in 1min 40s (224 kB/s)\nReading package lists..."} 
{"stream":"\n"} 
{"stream":" ---\u003e ff06741dea7e\n"} 
{"stream":"Removing intermediate container 7aefd190a165\n"} 
{"stream":"Step 4/4 : RUN apt-get -y install vim\n"} 
{"stream":" ---\u003e Running in e9ddad5a4695\n"} 
{"stream":"Reading package lists..."} 
{"stream":"\n"} 
{"stream":"Building dependency tree..."} 
{"stream":"\nReading state information...\n"} 
{"stream":"The following extra packages will be installed:\n libgpm2 libpython2.7 libpython2.7-minimal libpython2.7-stdlib vim-runtime\n"} 
{"stream":"Suggested packages:\n gpm ctags vim-doc vim-scripts\n"} 
{"stream":"The following NEW packages will be installed:\n libgpm2 libpython2.7 libpython2.7-minimal libpython2.7-stdlib vim\n vim-runtime\n"} 
{"stream":"0 upgraded, 6 newly installed, 0 to remove and 3 not upgraded.\nNeed to get 9074 kB of archives.\nAfter this operation, 42.9 MB of additional disk space will be used.\nGet:1 http://archive.ubuntu.com/ubuntu/ trusty/main libgpm2 amd64 1.20.4-6.1 [16.5 kB]\n"} 
....... 
{"stream":"Processing triggers for libc-bin (2.19-0ubuntu6.11) ...\n"} 
{"stream":" ---\u003e b1736dd9b698\n"} 
{"stream":"Removing intermediate container e9ddad5a4695\n"} 
{"stream":"Successfully built b1736dd9b698\n"} 
* Connection #0 to host 127.0.0.1 left intact 

überprüfen Sie die Docker Bilder, nachdem das Bild aufgebaut wird erfolgreich aufzubauen.

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

siehe dazu:

How to configure docker daemon port

+0

Sie missverstanden Frage. Die Frage war, wie man verhindert, dass große Dateien vom Remote-Server geladen und zurück an den Docker-Dämon gesendet werden (ich verwende den Remote-Client und die Datei befindet sich auf dem Docker-Dämon-Host). Nach dem Betrachten von Docker-Daemon-Code weiß ich, dass es nicht möglich ist, also stelle ich Datei über http aus und sende jetzt http-URL. – ISanych

Verwandte Themen