为了更深入地了解Docker,我创建了一个执行python脚本的dockerfile。它工作正常,但在执行脚本后容器崩溃。如何修改我的dockerfile以便在执行后销毁容器而不是让容器崩溃并一直重启?
Dockerfile:
FROM python:3
ADD aa.py /
CMD [ "python", "./aa.py" ]
的Python:
print('Hello!')
错误讯息:
2017-06-14 11:37:09 [CELL/0] OUT Starting health monitoring of container
2017-06-14 11:37:09 [APP/PROC/WEB/0] OUT Hello!
2017-06-14 11:37:09 [APP/PROC/WEB/0] OUT Exit status 0
2017-06-14 11:37:09 [CELL/0] OUT Exit status 143
2017-06-14 11:37:09 [CELL/0] OUT Destroying container
2017-06-14 11:37:09 [API/0] OUT Process has crashed with type: "web"
2017-06-14 11:37:09 [API/0] OUT App instance exited with guid 6fdede46-6751-4725-ad78-b76262dbe701 payload: {"instance"=>"", "index"=>0, "reason"=>"CRASHED", "exit_description"=>"2 error(s) occurred:\n\n* 2 error(s) occurred:\n\n* Codependent step exited\n* cancelled\n* cancelled", "crash_count"=>4, "crash_timestamp"=>1497433029411246770, "version"=>"98e2a035-e38f-4169-95fb-2701c8486e9c"}
2017-06-14 11:37:09 [CELL/0] OUT Successfully destroyed container
2017-06-14 11:38:31 [CELL/0] OUT Creating container
答案 0 :(得分:2)
注意:默认CMD
for python:3
is python3
。
exit code 143 means SIGTERM
为mentioned here。那是what docker sends
所以你需要python3 application to process SIGTERM signal gracefully
不要忘记你的python应用程序一旦完成并退出main函数,就会导致容器自动停止并退出。
与此同时,我发现处理Docker环境中的
SIGTERM
非常合适。然而,在CloudFoundry上的Docker中使用相同的代码并不能防止容器崩溃 在CloudFoundry中,您需要一个始终运行的应用程序,而不仅仅是执行任务,然后像脚本一样停止运行 即使在没有错误的情况下停止也会被检测为CloudFoundry中的崩溃。
我使用flask框架将我的脚本转换为REST服务器。现在它始终在运行,但只在通过其URL调用时才执行其任务。