docker-py:获取在ENTRYPOINT命令中运行的Python脚本输出

6 投票
1 回答
3057 浏览
提问于 2025-04-18 05:11

我在用Python的docker-py模块运行一个Python脚本时,遇到了输出获取的问题。

首先,给你点背景:

我创建了一个Dockerfile,并通过命令行正常构建了我的镜像(镜像ID是84730be6107f),命令是:docker build -t myimage /path/to/dockerfile。这个Python脚本是在Dockerfile中作为ENTRYPOINT命令执行的:

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

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

当我通过常规的docker命令行(在Ubuntu上)使用以下命令时:

docker run -v /host_dirpath:/cont_dirpath 84730be6107f

我能在终端看到预期的Python脚本输出(脚本最后有一个print result命令)。这正是我想要在Python中获取的输出。

但是,当我尝试通过Python中的docker-py包来做这件事时,结果却无法显示——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))

我只得到一个空字符串。我尝试在ENTRYPOINT命令中将脚本的输出通过echocat来传递,但都没有成功。我该如何将ENTRYPOINT命令中运行的script.py的输出记录到该容器的日志中,以便我可以使用docker-py的Python方法读取呢?我也尝试了docker-py的attach方法(我觉得logs只是这个方法的一个封装),结果也是一样。

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

任何见解或建议都将非常感谢!

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)

撰写回答