You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中获取Docker容器的内存限制?

在Docker容器内获取内存限制的Python实现方法

你遇到的问题是因为os.sysconf读取的是宿主机的系统参数,无法直接获取容器的内存限制。无需依赖Docker SDK或挂载/var/run/docker.sock,可以通过读取容器内的cgroup控制文件来获取实际内存限制——Docker正是通过cgroup机制实现容器资源管控的。

实现代码

以下代码兼容cgroup v1和v2版本,能准确返回容器的内存限制(单位:GB):

import os

def get_container_memory_limit():
    # 优先尝试cgroup v2路径(现代Linux发行版默认)
    cgroup_v2_path = "/sys/fs/cgroup/memory.max"
    if os.path.exists(cgroup_v2_path):
        with open(cgroup_v2_path, 'r') as f:
            limit_str = f.read().strip()
            if limit_str == "max":
                # 无内存限制时返回宿主机内存
                return (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES')) / (1024**3)
            return int(limit_str) / (1024**3)
    
    # 兼容cgroup v1路径
    cgroup_v1_path = "/sys/fs/cgroup/memory/memory.limit_in_bytes"
    if os.path.exists(cgroup_v1_path):
        with open(cgroup_v1_path, 'r') as f:
            limit = int(f.read().strip())
            # cgroup v1中"无限制"对应超大数值
            if limit == 9223372036854771712:
                return (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES')) / (1024**3)
            return limit / (1024**3)
    
    #  fallback:返回宿主机内存
    return (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES')) / (1024**3)

print(get_container_memory_limit())

测试命令

直接用你的容器启动命令测试:

docker run --rm -it --memory="2g" python:3.8 python -c "import os; def get_container_memory_limit(): cgroup_v2_path = '/sys/fs/cgroup/memory.max'; if os.path.exists(cgroup_v2_path): with open(cgroup_v2_path, 'r') as f: limit_str = f.read().strip(); if limit_str == 'max': return (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES'))/(1024.**3); return int(limit_str)/(1024.**3); cgroup_v1_path = '/sys/fs/cgroup/memory/memory.limit_in_bytes'; if os.path.exists(cgroup_v1_path): with open(cgroup_v1_path, 'r') as f: limit = int(f.read().strip()); if limit == 9223372036854771712: return (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES'))/(1024.**3); return limit/(1024.**3); return (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES'))/(1024.**3); print(get_container_memory_limit())"

说明

  • cgroup v2是当前主流Linux发行版(如Ubuntu 22.04+、CentOS 9+)的默认版本,对应文件/sys/fs/cgroup/memory.max
  • cgroup v1存在于较旧的系统中,对应文件/sys/fs/cgroup/memory/memory.limit_in_bytes
  • 若文件内容为max(v2)或9223372036854771712(v1),表示容器未设置内存限制,此时返回宿主机内存

内容的提问来源于stack exchange,提问作者SpAiK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:10:56