docker - 因内存不足而杀死的任何 Docker 钩子(Hook)

原文 标签 docker out-of-memory

我正在为守护程序作业运行 docker。每隔几个小时,容器就会被杀死。我想添加一些钩子(Hook)(回调),例如:

restart the container and then run some commands on the restarted container



Docker可以做到这一点吗?

否则,有没有更好的方法来检测 Python 或 Ruby 的行为?
java invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=0
java cpuset=bcb33ac552c23cfa531814fbc3a64ae5cd8d85aa19245e1560e0ce3e3310c798 mems_allowed=0
CPU: 3 PID: 14182 Comm: java Not tainted 4.1.0-x86_64-linode59 #1
 0000000000000000 ffff8800dc520800 ffffffff8195b396 ffff880002cf5ac0
 ffffffff81955e58 ffff8800a2918c38 ffff8800f43c3e78 0000000000000000
 ffff8800b5f687f0 000000000000000d ffffea0002d7da30 ffff88005bebdec0
Call Trace:
 [<ffffffff8195b396>] ? dump_stack+0x40/0x50
 [<ffffffff81955e58>] ? dump_header+0x7b/0x1fe
 [<ffffffff8119655d>] ? __do_fault+0x3f/0x79
 [<ffffffff811789d6>] ? find_lock_task_mm+0x2c/0x7b
 [<ffffffff81961c55>] ? _raw_spin_unlock_irqrestore+0x2d/0x3e
 [<ffffffff81178dee>] ? oom_kill_process+0xc5/0x387
 [<ffffffff811789d6>] ? find_lock_task_mm+0x2c/0x7b
 [<ffffffff811b76be>] ? mem_cgroup_oom_synchronize+0x3ad/0x4c7
 [<ffffffff811b6c92>] ? mem_cgroup_is_descendant+0x29/0x29
 [<ffffffff811796e7>] ? pagefault_out_of_memory+0x1c/0xc1
 [<ffffffff81963e58>] ? page_fault+0x28/0x30
Task in /docker/bcb33ac552c23cfa531814fbc3a64ae5cd8d85aa19245e1560e0ce3e3310c798 killed as a result of limit of /docker/bcb33ac552c23cfa531814fbc3a64ae5cd8d85aa19245e1560e0ce3e3310c798
memory: usage 524288kB, limit 524288kB, failcnt 14716553
memory+swap: usage 0kB, limit 9007199254740988kB, failcnt 0
kmem: usage 0kB, limit 9007199254740988kB, failcnt 0
Memory cgroup stats for /docker/bcb33ac552c23cfa531814fbc3a64ae5cd8d85aa19245e1560e0ce3e3310c798: cache:72KB rss:524216KB rss_huge:0KB mapped_file:64KB writeback:0KB inactive_anon:262236KB active_anon:262044KB inactive_file:4KB active_file:4KB unevictable:0KB
[ pid ]   uid  tgid total_vm      rss nr_ptes nr_pmds swapents oom_score_adj name
[14097]  1000 14097     5215       20      17       3       47             0 entry_point.sh
[14146]     0 14146    11960        0      30       3      101             0 sudo
[14150]  1000 14150     1112        7       8       3       22             0 xvfb-run
[14162]  1000 14162    51929    11220      90       3       95             0 Xvfb
[14169]  1000 14169   658641    18749     120       6        0             0 java
[14184]  1000 14184    28364      555      58       3        0             0 fluxbox
[24639]  1000 24639     5212       59      16       3        0             0 bash
Memory cgroup out of memory: Kill process 14169 (java) score 96 or sacrifice child
Killed process 14169 (java) total-vm:2634564kB, anon-rss:74996kB, file-rss:0kB

最佳答案

Docker 本身没有任何这样的机制。您所能做的就是通过--restart flag 告诉 Docker 何时应该尝试恢复失败的容器。

然而,大多数你想要保持容器的地方你会想要比 --restart 更复杂的东西。无论如何标志。一旦你使用 runit 或 systemd 来管理你的容器,很容易添加一些额外的 shell 代码来找出最后一次调用崩溃的原因,并根据它采取一些特殊的操作。

关于docker - 因内存不足而杀死的任何 Docker 钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31236959/

相关文章:

apache - 更改添加文件对Docker卷的权限

Nginx 反向代理背后的 Wordpress Docker

docker - Dockerfile WORKDIR,ENTRYPOINT,VOLUME…是否适用于子镜像?

c# - 减少文件操作的内存占用

C# 如何在不使用大量内存的情况下裁剪图像?

java - java.lang.OutOfMemoryError-“org.apache.jasper.compiler.JspRuntimeContext”的一个实例

docker - Docker 中的容器层和卷有什么区别?

docker - 如何在kubernetes应用程序中提供静态内容

java - BufferedInputStream在Android中抛出内存不足错误

java - java.lang.OutOfMemoryError(超出了GC开销限制)