acr*_*acr 6 python linux docker dockerpy
我在使用 Python 中的 docker-py 模块获取在 docker 容器中运行的 Python 脚本的输出时遇到问题。
首先,一些上下文:
我已经创建了一个 Dockerfile 并通过命令行 ( docker build -t myimage /path/to/dockerfile
)以正常方式构建了我的映像(ID 为 84730be6107f )。Python 脚本作为ENTRYPOINT
Dockerfile 中的命令执行:
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"} })
print "Docker logs: \n" + str(docker.logs(contid))
Run Code Online (Sandbox Code Playgroud)
我只是得到一个空字符串。我已经试过了脚本的输出管道,以echo
和cat
在ENTRYPOINT
命令,但无济于事。如何让ENTRYPOINT
命令中运行的 script.py 的输出成为该容器的日志的一部分,以便我可以使用 docker-py Python 方法读取它?我也尝试过 docker-pyattach
方法(我认为logs
这只是它的一个包装版本),结果相同。
我考虑过将脚本输出写入文件而不是标准输出,但不清楚如何使用 docker-py 方法访问和读取该文件。
任何见解或建议将不胜感激!
当您尝试使用 查看日志时会发生什么kubectl
?
kubectl logs $CONTAINERID
Run Code Online (Sandbox Code Playgroud)
我猜你什么也看不到。
您在容器内的工作负载是多少?
如果你的代码如下所示,当无头运行时,Python 对缓冲区做了一些奇怪的事情:
import time
while True:
print('something')
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
为了使其工作,您需要手动刷新循环打印语句:
import time
import sys
while True:
print('something')
sys.stdout.flush()
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2716 次 |
最近记录: |