如何限制 docker run 容器执行时长?

栏目: 编程工具 · 发布时间: 6年前

内容简介:有的时候我们需要跑一些不一定安全(不受信任)的程序时,可以通过 docker 实现资源隔离,其执行时长也需要控制,如果执行时间太长就终止运行。从 2013 年开始每隔一段时间都有人呼吁 docker 官方来实现这个特性,但官方并不打算实现。具体讨论细节请看

需求背景

有的时候我们需要跑一些不一定安全(不受信任)的程序时,可以通过 docker 实现资源隔离,其执行时长也需要控制,如果执行时间太长就终止运行。

Docker 本身是否支持超时控制

从 2013 年开始每隔一段时间都有人呼吁 docker 官方来实现这个特性,但官方并不打算实现。

具体讨论细节请看 https://github.com/moby/moby/issues/1905

错误的方案

以上讨论中以及其他地方陆续有人提出“外围”解决方案,其中有两种常见的错误方案值得我们注意。

kill docker run

timeout 3 docker run ... untrusted_program

docker run 本身是一个 docker client 派生的进程,使用 kill docker run 进程来终止容器进程运行(比如通过 Linux 命令 timeout 或者类似发送 kill 到 docker run 进程)的方案都可能会有问题,导致容器进程无法终止。主要原因是:

  • docker run 这个进程不一定能及时响应信号,即使响应了信号,也不一定能传到容器进程,比如 SIGKILL 就没法传递
  • 即使通过 docker run 进程将信号传给了容器进程,但容器进程也不一定响应该信号,比如非 SIGKILL 信号会被忽略

docker run kill

docker run ... timeout 3 untrusted_program

在容器进程执行前进行一定包装处理,比如还是通过 timeout 来控制执行时间。看上去没啥问题,但实际上这个做法非常不安全,因为这个不受信程序可以派生其他进程甚至修改已有的进程空间导致包装处理失效。

正确的解决方案

限制 docker run 执行超时唯一可靠的方法是通过 docker 容器操作命令( stop / kill / rm -f 等)来发送 SIGKILL 信号,这样 SIGKILL 信号会直接发到容器进程上。

当然,最终容器进程能不能被终止还要看进程所处状态,比如处于 D 状态就无法终止。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JAVA核心技术卷2

JAVA核心技术卷2

Cay S. Horstmann、Gary Cornell / 陈昊鹏、王浩、姚建平 / 机械工业出版社 / 2008-12 / 118.00元

《JAVA核心技术卷2:高级特征》是Java技术权威指南,全面覆盖Java技术的高级主题,包括流与文件、XML、网络、数据库编程、高级Swing、高级 AWT、JavaBean构件、安全、分布式对象、脚本、编译与注解处理等,同时涉及本地化、国际化以及Java SE 6的内容。《JAVA核心技术卷Ⅱ:高级特征》对Java技术的阐述精确到位,叙述方式深入浅出,并包含大量示例,从而帮助读者充分理解Jav......一起来看看 《JAVA核心技术卷2》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具