2014-11-10 22 views
9

Xét ví dụ vỏ này:Làm thế nào để gửi đến stdin của một container docker-py?

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

này sẽ thực hiện một container busybox và tạo một file mới /out với những nội dung hello.

Làm cách nào để thực hiện điều này với docker-py?

Các docker-py tương đương:

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

stdin_open = True, nhưng nơi nào tôi viết 'hello'?

Trả lời

-1

Bạn cần đính kèm vào vùng chứa trong khi đang chạy để truyền trực tuyến STDOUT/STDERR. Đây là cách:

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 là một generator nếu bạn có stream=True, vì vậy bạn có thể lặp trên nó và nhận được các bản ghi trong thời gian thực.

Thông tin chi tiết: http://docker-py.readthedocs.org/en/latest/api/

+2

tôi hỏi bằng văn bản cho stdin. Câu trả lời của bạn mô tả việc đọc stdout vùng chứa. – itsafire

4

Trở lại sau đó nó đã không thể đính kèm stdin để một container chạy. Điều này đã thay đổi.

Với phiên bản hiện tại của docker-py, giờ đây có thể bằng cách nào đó (còn gọi là giải pháp thay thế của slix). Điều này được lấy từ một cuộc thảo luận tại GitHub được tập trung vào python 2.7.

Xem ví dụ này trong python 3 với phiên bản Docker-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

Điều này vẫn đúng? – jrtapsell

+0

Tôi đã cập nhật câu trả lời. Thật vậy bây giờ có một cách để có được stdin vào container. – itsafire

Các vấn đề liên quan