2016-10-12 4 views
2

Ich verwende Docker-Py. Ich möchte eine Datei vom Andock-Container zum Host-Rechner kopieren.So kopieren Sie eine Datei vom Container zum Host mit Hilfe von Kopieren in Docker-py

Von Docker-py Dokumentation:

copy 

Identical to the docker cp command. Get files/folders from the container. 

Params: 

    container (str): The container to copy from 
    resource (str): The path within the container 

Returns (str): The contents of the file as a string 

ich Container erstellen könnte und starten Sie es aber nicht in der Lage, die Datei zu erhalten, die aus dem Behälter kopiert wird Host. Kann mir jemand helfen, darauf hinzuweisen, dass mir etwas fehlt? Ich habe /mydir/myshell.sh in meinem Docker-Container, den ich versucht habe, den Host zu kopieren.

>>> a = c.copy(container="7eb334c512c57d37e38161ab7aad014ebaf6a622e4b8c868d7a666e1d855d217", resource="/mydir/myshell.sh") >>> a 
<requests.packages.urllib3.response.HTTPResponse object at 0x7f2f2aa57050> 
>>> type(a) 
<class 'requests.packages.urllib3.response.HTTPResponse'> 

Es wird sehr hilfreich sein, wenn jemand mich herauszufinden helfen kann, ob es das Kopieren von nicht einmal die Datei kopiert oder.

+0

Gibt es Fortschritte dabei? –

Antwort

3

In meinem Python-Skript ich einen Anruf laufen Docker mit docker run -it -v artifacts:/artifacts target-build so kann ich meine Dateien von Docker Lauf erzeugt werden eingebaut in Artefakte Ordner.

+0

nette Abhilfe. – npatel

6

copy ist eine veraltete Methode in Docker und die bevorzugte Methode ist put_archive Methode zu verwenden. Also müssen wir im Grunde ein Archiv erstellen und es dann in den Container legen. Ich weiß, das klingt komisch, aber das unterstützt die API derzeit. Wenn Sie, wie ich, der Ansicht sind, dass dies verbessert werden kann, können Sie gerne eine Frage/eine Funktion anfragen, und ich werde sie verbessern.

Hier ist ein Code-Snippet auf, wie eine Datei in den Behälter kopieren:

def copy_to_container(container_id, artifact_file): 
    with create_archive(artifact_file) as archive: 
     cli.put_archive(container=container_id, path='/tmp', data=archive) 

def create_archive(artifact_file): 
    pw_tarstream = BytesIO() 
    pw_tar = tarfile.TarFile(fileobj=pw_tarstream, mode='w') 
    file_data = open(artifact_file, 'r').read() 
    tarinfo = tarfile.TarInfo(name=artifact_file) 
    tarinfo.size = len(file_data) 
    tarinfo.mtime = time.time() 
    # tarinfo.mode = 0600 
    pw_tar.addfile(tarinfo, BytesIO(file_data)) 
    pw_tar.close() 
    pw_tarstream.seek(0) 
    return pw_tarstream 
+0

Ich konnte es mit Volume-Option tun. Danke für den alternativen Vorschlag. –

+0

@Sweety das ist schön. Wären Sie so freundlich, Ihren Code zu posten? –

Verwandte Themen