docker-py:获取在ENTRYPOINT命令中运行的Python脚本输出
我在用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
命令中将脚本的输出通过echo
和cat
来传递,但都没有成功。我该如何将ENTRYPOINT
命令中运行的script.py的输出记录到该容器的日志中,以便我可以使用docker-py的Python方法读取呢?我也尝试了docker-py的attach
方法(我觉得logs
只是这个方法的一个封装),结果也是一样。
我考虑过直接将脚本输出写入文件,而不是写入标准输出,但我不太清楚如何使用docker-py的方法访问和读取那个文件。
任何见解或建议都将非常感谢!
1 个回答
当你尝试用 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)