【问题标题】:Stop a Docker container after executing code执行代码后停止 Docker 容器
【发布时间】:2017-06-14 09:42:53
【问题描述】:

为了更深入地了解 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

【问题讨论】:

  • 你是如何启动你的容器的?您可以使用docker run --rm mypython,它将在执行脚本后删除您的容器。
  • 我在 CloudFoundry 上使用 Docker。通过用户界面,我输入了一个 docker hub repo 并启动它。
  • 我从未使用过 cloudfundry,所以无法帮助您。我怀疑它会因为 cf 尝试重新启动,因为仅在 docker 中,该容器将运行,显示消息并停止。 --rm 选项将在运行后删除容器。我无法帮助您在 cf. 中重现此内容。

标签: python docker dockerfile docker-image


【解决方案1】:

注意:默认CMD for python:3 is python3

exit code 143 means SIGTERMmentioned here。那是what docker sends
所以你需要你的python3 application to process SIGTERM signal gracefully

不要忘记,你的 python 应用一旦完成并退出主函数,就会导致容器自动停止并退出。

The OP 添加in the comments

与此同时,我发现在 Docker 环境中处理 SIGTERM 工作得非常好。

但是,在 CloudFoundry 上的 Docker 中使用相同的代码并不能防止容器崩溃。
在 CloudFoundry 中,您需要一个始终运行的应用程序,而不仅仅是执行任务然后像脚本那样停止。
即使在没有错误的情况下停止也会被检测为 CloudFoundry 中的崩溃。

我使用烧瓶框架将我的脚本转换为 REST 服务器。现在它一直在运行,但只有在通过它的 url 调用时才执行它的任务。

【讨论】:

  • 谢谢。什么时候发出信号?脚本执行后?
  • 我尝试了解决方案,但在处理 SIGTERM 后它再次崩溃。
  • @user3080315 当主进程退出并且容器停止时发送信号。如果您的应用程序没有正确处理它,您可能会留下僵尸进程 (stackoverflow.com/a/33119321/6309)。这就是为什么使用 docker 1.13 或更高版本,你有 docker run --init: stackoverflow.com/a/39593409/6309
  • @user3080315 如果还是crash,在docker登录的时候,看看有没有额外的线索。
  • @user3080315 我会检查一下(我已经投票了),但我希望python专家也能看看;)
猜你喜欢
  • 2020-08-31
  • 2020-06-01
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多