docker build失败 - "无法分配内存"

Tal*_*Tal 6 docker amazon-elastic-beanstalk

我的docker构建失败,出现以下错误:

Untar fork/exec /usr/bin/docker: cannot allocate memory
Run Code Online (Sandbox Code Playgroud)

所以我得到它 - 没有RAM :)但我可以清楚地看到空闲内存作为交换:

             total       used       free     shared    buffers     cached
Mem:          7517       7334        183          0         59        515
-/+ buffers/cache:       6759        758
Swap:         4095       2635       1460
Run Code Online (Sandbox Code Playgroud)

此外,似乎docker占用了一个巨大的内存块:

$ top -a
top - 03:48:07 up 18 days, 17 min,  2 users,  load average: 1.88, 0.93, 0.42
Tasks: 127 total,   2 running, 125 sleeping,   0 stopped,   0 zombie
Cpu(s): 49.9%us, 14.0%sy,  0.0%ni, 13.7%id, 22.2%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   7697592k total,  6351288k used,  1346304k free,   138804k buffers
Swap:  4194300k total,   310324k used,  3883976k free,  1449268k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1340 root      20   0 3994m 2.1g 7548 S  6.6 28.8  64:20.43 docker
 5318 root      20   0 1499m 724m 4368 S 65.5  9.6   0:08.80 ruby
  978 root      20   0 1010m 616m   32 S  0.0  8.2   0:27.24 ruby
Run Code Online (Sandbox Code Playgroud)

所以问题是:
为什么"docker build"不使用交换区域作为额外的RAM并决定杀死构建?

use*_*461 -2

它简单明了。你失忆了。您必须通过停止应用程序来释放内存。

交换通常比实际内存慢一千倍。有很多应用程序会禁止交换数据,例如:

  • 为了提高性能,数据库通常会强制某些关键数据不可交换。

  • 由于各种原因,诸如内核和驱动程序之类的低级系统组件是不可交换的。(如果磁盘驱动程序已交换,如何读取交换磁盘?:D)

Docker 依赖许多低级原语来运行和操作容器,它们很可能需要有可用的实际内存。因此当物理内存不足时 Docker 无法运行。