6

我无法使用 Python 中的 docker-py 模块获取在 docker 容器中运行的 Python 脚本的输出。

首先,一些背景:

我创建了一个 Dockerfile 并通过命令行docker build -t myimage /path/to/dockerfile( Python 脚本作为ENTRYPOINTDockerfile 中的命令执行:

ENTRYPOINT ["python", "/cont_dirpath/script.py"]

包含脚本的目录在运行时被添加(绑定)到容器中。

当我通过通常的 docker 命令行(在 Ubuntu 中)执行此操作时,使用:

docker run -v /host_dirpath:/cont_dirpath 84730be6107f

我将预期的 Python 脚本输出打印到标准输出(显示在终端中 - 脚本以print result命令结尾)。这正是我在 Python 中执行此操作时想要获得的输出。

但是,当尝试使用 docker-py 包从 Python 中执行此操作时,我无法查看结果 - 该logs方法返回一个空字符串。这是我正在使用的 Python 代码:

from docker import Client

docker = Client(base_url='unix://var/run/docker.sock',
                  version='1.10',
                  timeout=10)

contid = docker.create_container('84730be6107f', volumes={"/cont_dirpath":""})
docker.start(contid, binds={"/host_dirpath": {"bind": "/cont_dirpath"} })

print "Docker logs: \n" + str(docker.logs(contid))

我只是得到一个空字符串。我尝试将脚本的输出通过管道传输到echo命令cat中,ENTRYPOINT但无济于事。如何在ENTRYPOINT命令中获取 script.py run 的输出作为该容器日志的一部分,以便我可以使用 docker-py Python 方法读取它?我也尝试了 docker-pyattach方法(我认为logs这只是一个包装版本),结果相同。

我考虑过将脚本输出写入文件而不是标准输出,但不清楚我将如何使用 docker-py 方法访问和读取该文件。

任何见解或建议将不胜感激!

4

1 回答 1

2

当您尝试使用 查看日志时会发生什么kubectl

kubectl logs $CONTAINERID

我猜你什么也看不到。

您在容器内的工作量是多少?

如果您的代码如下所示,Python 在无头运行时会对缓冲区执行一些奇怪的操作:

import time
while True:
   print('something')
   time.sleep(1)

要使其工作,您需要手动刷新循环打印语句:

import time
import sys
while True:
   print('something')
   sys.stdout.flush()
   time.sleep(1)
于 2018-06-25T02:26:34.737 回答