【问题标题】:Determining the Docker for Mac RAM limit from Node从 Node 确定 Docker for Mac RAM 限制
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

    • 很棒的建议,谢谢!它比读取示例使用的 JSON 文件要慢,但如果我需要,这会暴露更多信息。运行busybox容器的速度比我预期的要快得多——请注意。
    【解决方案2】:

    Docker for Mac 的设置存储在一个简单的 JSON 文件中,地址为 ~/Library/Group Containers/group.com.docker/settings.json。 RAM 限制在'memoryMiB' 键下指定为整数。我们可以这样从 Node 中读取:

    const fs = require('fs');
    const os = require('os');
    const path = require('path');
    
    (() => {
      const configPath = path.join(
        os.homedir(),
        "Library/Group Containers/group.com.docker/settings.json"
      );
    
      const config = JSON.parse(fs.readFileSync(configPath, {
        encoding: 'utf8'
      }));
    
      if (typeof config.memoryMiB === 'number' && config.memoryMiB < 8000) {
        console.warn(
          `Docker for Mac is configured to use ${config.memoryMiB} MiB of RAM.`);
        console.warn(
          'Consider raising it to 8 GB or you may encounter performance issues.');
      }
    })();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多