使用 Docker SDK for python 时如何将 Docker 容器输出流式传输到终端

dza*_*ang 5 python bash shell stdout docker

我有一个 docker 容器,它执行一组操作并将输出打印到终端。在使用 Docker SDK for python 时,我无法弄清楚如何获取终端输出。

这是我想要实现的一个例子。假设我有一个包含以下文件的文件夹:

Project
  Dockerfile
  now.py
  dockerpy.py
Run Code Online (Sandbox Code Playgroud)

哪里now.py是一个简单的脚本,它每秒打印当前时间十秒钟:

# now.py

from datetime import datetime
import time

for _ in range(10):
    print(datetime.now())
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

Dockerfile为运行脚本的容器构建映像:

FROM python
ADD . /code
ENTRYPOINT ["python", "/code/now.py"]
Run Code Online (Sandbox Code Playgroud)

使用 构建映像后docker build -t dpytest .,我运行dockerpy.py以启动容器:

# dockerpy.py

import docker
from datetime import datetime

if __name__ == '__main__':

    client = docker.from_env()
    print('{} - Starting\n'.format(datetime.now()))
    container = client.containers.run("dpytest", detach=True)
    for line in container.logs(stream=True):
        print(line.strip())
    print('\n{} - Completed\n'.format(datetime.now()))
Run Code Online (Sandbox Code Playgroud)

容器启动、执行并在 10 秒后将整个输出打印到终端会话:

$ python dockerpy.py
2019-03-18 12:18:43.508384 - Starting

b'2019-03-18 11:18:44.344516'
b'2019-03-18 11:18:45.345600'
b'2019-03-18 11:18:46.346731'
b'2019-03-18 11:18:47.347814'
b'2019-03-18 11:18:48.348900'
b'2019-03-18 11:18:49.350057'
b'2019-03-18 11:18:50.351209'
b'2019-03-18 11:18:51.352425'
b'2019-03-18 11:18:52.353539'
b'2019-03-18 11:18:53.354598'

2019-03-18 12:18:54.471805 - Completed
Run Code Online (Sandbox Code Playgroud)

我想要实现的是将容器输出附加到我的 shell 并在进程发生时获取打印,而不是在容器退出时获取打印。