这里的目的是使用docker容器作为安全沙箱,在其中运行不受信任的python脚本,但要在python中使用docker-py模块执行此操作,并能够捕获该脚本的输出。
我在docker容器中运行python脚本foo.py (它被设置为docker文件中的ENTRYPOINT
命令,所以它在容器运行时立即执行),并且无法捕获该脚本的输出。当我通过普通的CLI运行容器时
docker run -v /host_dirpath:/cont_dirpath my_image
(host_dirpath
是包含foo.py的目录)我将foo.py的预期输出打印到标准输出,这只是一个键-值对的字典。但是,我尝试在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('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确实正确地捕获了输出。
发布于 2014-06-12 20:05:55
您正在经历这种行为,因为python在默认情况下会缓冲其输出。
举个例子:
vagrant@docker:/vagrant/tmp$ cat foo.py
#!/usr/bin/python
from time import sleep
while True:
print "f00"
sleep(1)
然后,从作为守护进程运行的容器中观察日志不会显示任何内容:
vagrant@docker:/vagrant/tmp$ docker logs -f $(docker run -d -v $(pwd):/app dockerfile/python python /app/foo.py)
但是,如果您使用-u
命令行参数禁用python缓冲输出,所有内容都会显示出来:
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
环境变量:
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
参数的情况下运行的容器。
发布于 2014-10-31 19:32:53
您可能会遇到竞争条件,因为启动的容器与您的控制程序并行运行。在抓取日志之前,您需要等待容器启动和结束。在docker.start后面的代码中添加一个docker.wait。
docker.wait(contid)
您的输出似乎是空的,因为还没有记录任何内容。
https://stackoverflow.com/questions/23524976
复制相似问题