如何在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
相关产品推荐
相关产品推荐

