小编acr*_*acr的帖子

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

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

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

docker run -v /host_dirpath:/cont_dirpath my_image
Run Code Online (Sandbox Code Playgroud)

(host_dirpath是包含foo.py的目录)我得到foo.py的预期输出打印到stdout,这只是一个键值对的字典.但是,我正在尝试使用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))
Run Code Online (Sandbox Code Playgroud)

这只会导致"Docker日志:" - 日志中没有捕获任何内容,stdout和stderr都没有(我尝试在foo.py中引发异常来测试它).

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

任何帮助将不胜感激.提前致谢!

编辑:

使用docker-py仍然没有运气,但是当使用subprocess.Popen使用普通CLI运行容器时它运行良好 - 执行此操作时,输出确实被stdout正确抓取.

python linux docker dockerpy

23
推荐指数
1
解决办法
1万
查看次数

docker-py:访问在 ENTRYPOINT 命令中运行的 python 脚本的输出

我在使用 Python 中的 docker-py 模块获取在 docker 容器中运行的 Python 脚本的输出时遇到问题。

首先,一些上下文:

我已经创建了一个 Dockerfile 并通过命令行 ( docker build -t myimage /path/to/dockerfile)以正常方式构建了我的映像(ID 为 84730be6107f )。Python 脚本作为ENTRYPOINTDockerfile 中的命令执行:

ENTRYPOINT ["python", "/cont_dirpath/script.py"]
Run Code Online (Sandbox Code Playgroud)

包含脚本的目录在运行时被添加(绑定)到容器中。

当我通过通常的 docker 命令行(在 Ubuntu 中)使用以下命令执行此操作时:

docker run -v /host_dirpath:/cont_dirpath 84730be6107f
Run Code Online (Sandbox Code Playgroud)

我将预期的 Python 脚本输出打印到 stdout(显示在终端中 - 脚本以print result命令结尾)。这正是我在 Python 中执行此操作时试图获得的输出。

但是,当尝试使用 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('84730be6107f', volumes={"/cont_dirpath":""})
docker.start(contid, binds={"/host_dirpath": {"bind": "/cont_dirpath"} …
Run Code Online (Sandbox Code Playgroud)

python linux docker dockerpy

6
推荐指数
1
解决办法
2716
查看次数

标签 统计

docker ×2

dockerpy ×2

linux ×2

python ×2