Tur*_*gut 6 python django google-cloud-storage google-cloud-platform kubernetes
我有一个 docker 镜像,我想在 django 代码中运行它。在该图像内有一个我使用 C++ 编写的可执行文件,它将其输出写入谷歌云存储。通常当我像这样运行 django 代码时:
container = client.V1Container(name=container_name, command=["//usr//bin//sleep"], args=["3600"], image=container_image, env=env_list, security_context=security)
Run Code Online (Sandbox Code Playgroud)
并手动进入容器内部运行以下命令:
gcloud container clusters get-credentials my-cluster --region us-central1 --project proj_name && kubectl exec pod-id -c jobcontainer -- xvfb-run -a "path/to/exe"
Run Code Online (Sandbox Code Playgroud)
它按预期工作并将输出发送到云存储。(我需要使用虚拟监视器,所以我首先使用 xvfb)。但是我必须通过 django 调用它,如下所示:
container = client.V1Container(name=container_name, command=["xvfb-run"], args=["-a","\"path/to/exe\""], image=container_image, env=env_list, security_context=security)
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,作业被创建但从未完成,并且不会向存储发出输出。当我进入容器运行时,ps aux我得到以下输出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2888 1836 ? Ss 07:34 0:00 /bin/sh /usr/bin/xvfb-run -a "path/to/exe"
root 16 0.0 1.6 196196 66256 ? S 07:34 0:00 Xvfb :99 -screen 0 1280x1024x24 -nolisten tcp -auth /tmp/xvfb-run.r5gaBO/Xauthority
root 35 0.0 0.0 7016 1552 ? Rs 10:31 0:00 ps aux
Run Code Online (Sandbox Code Playgroud)
看起来它卡在我的代码中,但我的代码没有可以卡在里面的循环,也许发生了错误(我不这么认为,因为手动输入时完全相同的命令正在工作)。如果出现错误,如何查看控制台输出?为什么我的代码会卡住以及如何获得所需的输出?是否会出现由权限引起的错误(代码执行了很多需要权限的操作,例如写入存储和读取 Pod 内的文件,但是当我通过命令行运行它时,就像提到的那样可以正常工作)?
显然,对于任何有类似问题的人来说,我们通过在末尾添加我们想要运行的命令来修复它,Dockerfile而不是将其作为参数传递到 django 的容器调用中,如下所示:
cmd["entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)
入口点.sh:
xvfb-run -a "path/to/exe"
Run Code Online (Sandbox Code Playgroud)
不像我们之前那样在 django 内部调用它,而是简单地从容器调用中删除命令参数,所以它看起来像这样:
container = client.V1Container(name=container_name, image=container_image, env=env_list, stdin=True, security_context=security)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |