处理多路复用的流

备注

下面的说明假定您对从 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"'

我们将使用以下所有四种组合来运行此命令 streamdemux

使用 stream=Falsedemux=False ,则输出是一个字符串,其中既包含 stdout 以及 stderr 输出:

>>> res = container.exec_run(cmd, stream=False, demux=False)
>>> res.output
b'hello stderr\nhello stdout\n'

使用 stream=True ,以及 demux=False ,则输出是一个生成器,它生成包含两者的输出的字符串 stdoutstderr

>>> 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=Truedemux=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=Falsedemux=True ,则输出是一个元组 (stdout, stderr)

>>> res = container.exec_run(cmd, stream=False, demux=True)
>>> res.output
(b'hello stdout\n', b'hello stderr\n')