当前位置: 首页 > 知识库问答 >
问题:

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

萧远
2023-03-14

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

我正在docker容器中运行python脚本foo.py(它在docker文件中被设置为ENTRYPOINT命令,因此它会在容器运行后立即执行),无法捕获该脚本的输出。当我通过普通CLI使用

docker run -v /host_dirpath:/cont_dirpath my_image

host\u dirpath是包含foo.py的目录)我得到了打印到stdout的foo.py的预期输出,stdout只是一个键值对字典。然而,我试图在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日志”-日志中没有捕获任何内容,无论是stdout还是stderr(我尝试在foo.py中引发一个异常来测试)。

我所追求的结果是由foo.py计算出来的,目前只是用pythonprint语句打印到stdout。如何将其包含在docker容器日志中,以便从python中读取?或者从容器外部以其他方式捕获此输出?

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

编辑:

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

共有2个答案

令狐宜民
2023-03-14

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

docker.wait(contid)

您的输出似乎为空,因为尚未记录任何内容。

蒙麒
2023-03-14

您正在经历这种行为,因为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

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

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参数的情况下运行的容器。

 类似资料:
  • 我试图在docker容器中使用docker compose来运行shell脚本。我正在使用Dockerfile构建容器环境并安装所有依赖项。然后我将所有项目文件复制到容器中。据我所知,这很有效。(我对docker还是相当陌生的,docker撰写) 我的Dockerfile: 我目前正在尝试的是: docker编写文件: 这导致容器无法启动,从日志中我得到以下结果: 有关更多参考和信息,请参阅我的e

  • 问题内容: 我正在尝试创建用于设置Docker容器的Shell脚本。我的脚本文件如下所示: 运行此脚本文件将在新调用的bash中运行容器。 现在,我需要运行一个脚本文件(test.sh),该文件已经位于上述给定的shell脚本的容器内(例如:cd /path/to/test.sh && ./test.sh),该怎么做? 问题答案: 您可以使用以下命令在正在运行的容器中运行命令: 并从bash会话运

  • 我一直在使用localstack开发一个针对Local的服务。我刚刚通过运行了他们的docker映像

  • 我有一个服务,我正在通过Rancher通过Docker-Compose提出。我遇到的问题是需要在容器部署后设置密码。

  • 本文向大家介绍python脚本监控docker容器,包括了python脚本监控docker容器的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python脚本监控docker容器的方法,供大家参考,具体内容如下 脚本功能: 1、监控CPU使用率 2、监控内存使用状况 3、监控网络流量 具体代码:   以上就是python脚本监控docker容器的全部代码,希望对大家的学习有所帮助。

  • 问题内容: 我的目录仅包含两个文件,并且: 在读 并且仅包含 在成功生成: 但是,如果尝试这样做,则会出现错误: 是什么原因造成的?(我记得以类似的方式在基于图像的脚本中运行脚本,所以也许它是Alpine特有的)? 问题答案: Alpine附带ash作为默认外壳,而不是。 所以你可以 有一个shebang将/ bin / bash定义为sayhello.sh的第一行,因此您的文件sayhello.