处理多路复用的流¶
备注
下面的说明假定您对从 exec
指挥部。这些指令同样适用于 attach
。
首先创建一个在后台运行的容器:
>>> client = docker.from_env()
>>> container = client.containers.run(
... 'bfirsh/reticulate-splines', detach=True)
准备我们要使用的命令。它打印“hello stdout”in stdout ,后跟中的“hello stderr” stderr :
>>> cmd = '/bin/sh -c "echo hello stdout ; echo hello stderr >&2"'
我们将使用以下所有四种组合来运行此命令 stream
和 demux
。
使用 stream=False
和 demux=False
,则输出是一个字符串,其中既包含 stdout 以及 stderr 输出:
>>> res = container.exec_run(cmd, stream=False, demux=False)
>>> res.output
b'hello stderr\nhello stdout\n'
使用 stream=True
,以及 demux=False
,则输出是一个生成器,它生成包含两者的输出的字符串 stdout 和 stderr :
>>> res = container.exec_run(cmd, stream=True, demux=False)
>>> next(res.output)
b'hello stdout\n'
>>> next(res.output)
b'hello stderr\n'
>>> next(res.output)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
使用 stream=True
和 demux=True
,生成器现在分离流,并生成元组 (stdout, stderr)
:
>>> res = container.exec_run(cmd, stream=True, demux=True)
>>> next(res.output)
(b'hello stdout\n', None)
>>> next(res.output)
(None, b'hello stderr\n')
>>> next(res.output)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
最后,有了 stream=False
和 demux=True
,则输出是一个元组 (stdout, stderr)
:
>>> res = container.exec_run(cmd, stream=False, demux=True)
>>> res.output
(b'hello stdout\n', b'hello stderr\n')