2014-11-10 13 views
9

Biorąc pod uwagę ten przykład powłoki:Jak wysłać do stdin kontenera docker-py?

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

ten będzie wykonywał pojemnik BusyBox i utworzyć nowy plik /out z treścią hello.

Jak mógłbym to osiągnąć dzięki docker-py?

docker-py równoważne:

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

Jest stdin_open = True, ale gdzie mogę napisać 'hello'?

Odpowiedz

-1

Musisz podłączyć się do kontenera, gdy jest uruchomiony, aby przesyłać strumieniowo STDOUT/STDERR. Oto jak:

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 jest generator jeśli masz stream=True, więc można iteracyjne nad nim i dostać logi w czasie rzeczywistym.

Więcej szczegółów: http://docker-py.readthedocs.org/en/latest/api/

+2

poprosiłem o piśmie do standardowego wejścia. Twoja odpowiedź opisuje czytanie stdouta kontenera. – itsafire

4

Back to nie było możliwe, aby dołączyć stdin do uruchomionego kontenera. To się zmieniło.

Obecna wersja docker-py jest teraz jakoś możliwa (inaczej obejście slixa). Jest to zaczerpnięte z dyskusji pod adresem GitHub, która koncentruje się na python 2.7.

Zobacz ten przykład w Pythonie 3 z wersji doker-py 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

Czy to nadal prawda? – jrtapsell

+0

Zaktualizowałem odpowiedź. Rzeczywiście istnieje teraz sposób na załadowanie stdin do kontenera. – itsafire