【发布时间】:2019-08-27 16:11:08
【问题描述】:
背景
我们正在使用 Docker for Mac。 Docker/Linux Containers 不能在 MacOS/Darwin/Unix 上原生运行,所以 Docker for Mac 在内部运行一个 Linux 虚拟机,所有的容器实际上都在上面运行。
Docker for Mac 有一个 GUI 设置界面,可以让我们指定分配给这个 Linux 虚拟机的 RAM (screenshot)。它似乎默认为 2 GB,但我们的开发环境实际最小为 8 GB,否则我们会遇到病态交换并且 Docker 守护程序可能会变得无响应。
我们的问题是 RAM 限制似乎有时会被静默地重置为此默认值。这似乎发生在自动更新之后,但并非始终如一。我们的团队成员并不总是意识到发生了什么,并且经常在找到真正的原因之前浪费时间调查他们的性能问题的其他原因。
问题
我们使用 Node 脚本来启动大部分本地开发环境。如何从 Node 检测 Docker for Mac 中当前的 RAM 限制,以便我们的脚本在低于我们预期的最小值时向我们的开发人员显示警告消息?
尝试的解决方案
我没有找到任何直接公开此设置的docker 命令,但docker stats 命令报告每个正在运行的容器的内存使用情况,并且它们各自的 RAM 限制似乎与我设置的相同Docker for Mac 整体。
docker stats --no-stream --format "{{.MemUsage}}"
172MiB / 7.786GiB
175.6MiB / 7.786GiB
171.7MiB / 7.786GiB
1.031MiB / 7.786GiB
我一直在努力解析其中的价值。
const execa = require('execa');
(async () => {
const result = await execa(
'docker',
['stats', '--no-stream', '--format', '{{.MemUsage}}'],
{encoding: 'utf8'}
);
const stdout = await result.stdout;
const firstLine = stdout.split(/\n/)[0];
const limit = firstLine.split(/ \/ /)[1];
console.log(limit); // 7.786GiB
})();
但是,这有一个主要限制:它仅在当前有容器运行时才有效。我想用它来警告用户在启动任何容器之前。结果是为人类格式化的,带有潜在可变的单位后缀,这也很不方便。
有什么好的方法可以从 Node 中检测 Docker for Mac RAM 限制设置吗?
【问题讨论】:
标签: javascript node.js docker docker-for-mac