首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >捕获在docker容器中运行的python脚本的输出

捕获在docker容器中运行的python脚本的输出
EN

Stack Overflow用户
提问于 2014-05-08 02:01:44
回答 2查看 18.4K关注 0票数 31

这里的目的是使用docker容器作为安全沙箱,在其中运行不受信任的python脚本,但要在python中使用docker-py模块执行此操作,并能够捕获该脚本的输出。

我在docker容器中运行python脚本foo.py (它被设置为docker文件中的ENTRYPOINT命令,所以它在容器运行时立即执行),并且无法捕获该脚本的输出。当我通过普通的CLI运行容器时

代码语言:javascript
运行
复制
docker run -v /host_dirpath:/cont_dirpath my_image

(host_dirpath是包含foo.py的目录)我将foo.py的预期输出打印到标准输出,这只是一个键-值对的字典。但是,我尝试在python中使用docker-py模块执行此操作,但不知何故,logs方法并未捕获脚本输出。下面是我使用的python代码:

代码语言:javascript
运行
复制
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:“-日志中没有捕获任何内容,既不是标准输出,也不是标准错误(我尝试在foo.py内部引发一个异常来测试这一点)。

我想要的结果是由foo.py计算的,目前只是使用python print语句打印到标准输出。我怎样才能将它包含在docker容器日志中,这样我就可以从python中读取它了?或者以其他方式从容器外部捕获此输出?

任何帮助都将不胜感激。提前感谢!

编辑:

使用docker-py仍然不走运,但在使用subprocess.Popen的普通CLI运行容器时,它工作得很好-执行此操作时,stdout确实正确地捕获了输出。

EN

回答 2

Stack Overflow用户

发布于 2014-06-12 20:05:55

您正在经历这种行为,因为python在默认情况下会缓冲其输出。

举个例子:

代码语言:javascript
运行
复制
vagrant@docker:/vagrant/tmp$ cat foo.py
#!/usr/bin/python
from time import sleep

while True:
    print "f00"
    sleep(1)

然后,从作为守护进程运行的容器中观察日志不会显示任何内容:

代码语言:javascript
运行
复制
vagrant@docker:/vagrant/tmp$ docker logs -f $(docker run -d -v $(pwd):/app dockerfile/python python /app/foo.py)

但是,如果您使用-u命令行参数禁用python缓冲输出,所有内容都会显示出来:

代码语言:javascript
运行
复制
vagrant@docker:/vagrant/tmp$ docker logs -f $(docker run -d -v $(pwd):/app dockerfile/python python -u /app/foo.py)
f00
f00
f00
f00

您还可以注入PYTHONUNBUFFERED环境变量:

代码语言:javascript
运行
复制
vagrant@docker:/vagrant/tmp$ docker logs -f $(docker run -d -v $(pwd):/app -e PYTHONUNBUFFERED=0 dockerfile/python python /app/foo.py)
f00
f00
f00
f00

请注意,此行为仅影响在没有-t--tty参数的情况下运行的容器。

票数 23
EN

Stack Overflow用户

发布于 2014-10-31 19:32:53

您可能会遇到竞争条件,因为启动的容器与您的控制程序并行运行。在抓取日志之前,您需要等待容器启动和结束。在docker.start后面的代码中添加一个docker.wait。

代码语言:javascript
运行
复制
docker.wait(contid)

您的输出似乎是空的,因为还没有记录任何内容。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23524976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档