2014-11-10 4 views
9

In Anbetracht dieser Shell Beispiel:Wie an die Standardeingabe eines Docker-Py-Containers zu senden?

echo "hello" | docker run --rm -ti -a stdin busybox \ 
    /bin/sh -c "cat - >/out" 

Dies wird ein Busybox Container ausführen und eine neue Datei /out mit dem Inhalt hello erstellen.

Wie würde ich dies mit Docker-Py erreichen?

Das docker-py Äquivalent:

container = docker_client.create_container('busybox', 
              stdin_open = True, 
              command = 'sh -c "cat - >/out"' 
              ) 
docker_client.start(container) 

Es gibt stdin_open = True, aber wo schreibe ich den 'hello'?

Antwort

-1

Sie müssen den Container verbinden, während er ausgeführt wird, um den STDOUT/STDERR zu streamen. Hier ist, wie:

container = docker_client.create_container('busybox', 
             stdin_open = True, 
             command = 'sh -c "cat - >/) 
docker_client.start(container) 
out_stream = docker_client.attach(container=container, stdout=True, 
            stderr=True, stream=True) 

out_stream ein generator ist, wenn Sie stream=True haben, so können Sie über sie iterieren und die Protokolle in Echtzeit erhalten.

Weitere Details: http://docker-py.readthedocs.org/en/latest/api/

+2

ich zum Schreiben auf stdin gefragt. Ihre Antwort beschreibt das Lesen der Container-Standardausgabe. – itsafire

4

Damals war es nicht möglich, stdin zu einem laufenden Behälter zu befestigen. Das hat sich geändert.

Mit der aktuellen Version von docker-py ist dies jetzt irgendwie möglich (alias slix's workaround). Dies stammt aus einer Diskussion unter GitHub, die auf Python 2.7 konzentriert ist.

Sehen Sie dieses Beispiel in Python 3 mit Docker-py Version 3.1.1

import docker, tarfile 
from io import BytesIO 

def test_send_data_via_stdin_into_container(): 
    client = docker.APIClient() 

    # create container 
    container = client.create_container(
     'busybox', 
     stdin_open = True, 
     command = 'sh -c "cat - >/received.txt"') 
    client.start(container) 

    # attach stdin to container and send data 
    original_text_to_send = 'hello this is from the other side' 
    s = client.attach_socket(container, params={'stdin': 1, 'stream': 1}) 
    s._sock.send(original_text_to_send.encode('utf-8')) 
    s.close() 

    # stop container and collect data from the testfile 
    client.stop(container) 
    client.wait(container) 
    raw_stream,status = client.get_archive(container,'/received.txt') 
    tar_archive = BytesIO(b"".join((i for i in raw_stream))) 
    t = tarfile.open(mode='r:', fileobj=tar_archive) 
    text_from_container_file = t.extractfile('received.txt').read().decode('utf-8') 
    client.remove_container(container) 

    # check for equality 
    assert text_from_container_file == original_text_to_send 

if __name__ == '__main__': 
    test_send_data_via_stdin_into_container() 
+0

Ist das immer noch wahr? – jrtapsell

+0

Ich habe die Antwort aktualisiert. Tatsächlich gibt es jetzt einen Weg, um in den Container zu kommen. – itsafire

Verwandte Themen