这里的目的是使用Docker容器作为安全沙箱来运行不受信任的Python脚本,但要从Python内部使用docker-py模块实现,并能够捕获该脚本的输出。 我正在Docker容器中运行一个名为foo.py的Python脚本(它被设置为Dockerfile中的ENTRYPOINT命令,因此一旦运行容器就会执行它),但无法捕获该脚本的输出。 当我通过普通的CLI运行容器时...
docker run -v /host_dirpath:/cont_dirpath my_image
(host_dirpath
是包含 foo.py 文件的目录) 我在控制台上看到了 foo.py 期望输出的内容,这只是一个键值对字典。然而,我尝试使用 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('my_image', volumes={"/cont_dirpath":""})
docker.start(contid, binds={"/host_dirpath": {"bind": "/cont_dirpath"} })
print "Docker logs: " + str(docker.logs(contid))
这只会导致 "Docker logs:" - 日志中没有捕获任何内容,包括stdout和stderr(我尝试在foo.py内引发异常以测试此功能)。
我需要的结果是由foo.py计算出来的,并且目前仅使用python print
语句打印到stdout。我该如何将其包含在docker容器日志中,以便我可以从python中读取它?或者从容器外部以其他方式捕获此输出?
非常感谢您的帮助。提前致谢!
编辑:
使用docker-py仍然没有成功,但是使用普通CLI运行容器时,通过subprocess.Popen确实可以正确地抓取输出到stdout。
docker logs -f [container id]
对于我来说非常好,可以检查在容器中运行的Flask应用程序。 - james-see