javascript - 从 Node 确定Docker for Mac RAM限制

标签 javascript node.js docker docker-for-mac

背景

我们正在使用Mac的Docker。 Docker / Linux容器不能在MacOS / Darwin / Unix上本地运行,因此Mac上的Docker for Mac内部运行Linux虚拟机,而所有容器实际上都在该虚拟机上运行。

Docker for Mac具有GUI设置界面,可让我们指定分配给此Linux虚拟机(screenshot)的RAM。它似乎默认为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

我一直在努力从中解析出值(value)。

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限制设置吗?

最佳答案

“主机”的/proc文件系统暴露在容器中,因此您可以直接检查以下内容:

docker run --rm busybox cat /proc/meminfo \
  | grep MemTotal

您也可以在此处找到SwapTotal设置。从技术上讲,这些是Linux内核值,但它们反射(reflect)了Docker for Mac控件中的VM设置。

关于javascript - 从 Node 确定Docker for Mac RAM限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57678631/

相关文章:

javascript - 如何通过 Angular 在 JSON 文件中使用 HTML 标签/属性

javascript - setState 不更新状态数组

javascript - jqGrid如何根据状态数据动态填充选项列表?

c++ - 如何配置 bitbucket-pipelines.yml 以使用 cmake 或 make on repo?

.net - 在本地 kubernetes 中调试 dotnet core 3.1 应用程序

javascript - Angular Controller 向 Nodejs 服务器发送数据或从 Nodejs 服务器接收数据

mysql - Node.js 和 node-mysql - 无法实时广播/发送到站点

javascript - 指挥官.js : script not waiting for user input

javascript - axios图片流Base64编码后转成字符串?

apache - 如何修复: Apache httpd container for Docker shuts down unexpectedly (SIGTERM)