2014-11-10 21 views
9

bu kabuk örneği düşünüldüğünde:Docker-py konteynerinin stdinine nasıl yollanır?

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

Bu busybox kabı yürütmek ve içerikleri hello ile yeni bir dosya /out yaratacaktır.

Bunu docker-py ile nasıl yapabilirim?

docker-py eşdeğeri:

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

Orada stdin_open = True olmakla nerede 'hello' yazıyorsunuz?

cevap

-1

STDOUT/STDERR akışını yürütmek için çalışırken kabına iliştirmeniz gerekir. Eğer stream=True varsa

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 bir generator, yani üzerinde yineleme ve gerçek zamanlı olarak günlükleri alabilirsiniz: İşte nasıl.

Diğer ayrıntılar: o zaman Geri http://docker-py.readthedocs.org/en/latest/api/

+2

liman işçisi-py sürümüyle piton 3'te bu örneğe bakın. Cevabınız konteynır stdoutunu okurken açıklanmaktadır. – itsafire

4

bir çalışan kap Stdin'i eklemek mümkün değildi. Bu değişti.

Docker-py'in şu anki sürümü ile bu bir şekilde mümkün olabilir (aka slix'ın geçici çözümü). Bu, python 2.7'ye odaklanan GitHub numaralı telefondan bir tartışmadan alınmıştır. Ben stdin'e yazma istedi 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

Bu hala geçerli mi? – jrtapsell

+0

Cevabı güncelledim. Gerçekten de konteynere stdin almanın bir yolu var. – itsafire

İlgili konular