Docker容器如何判断内存是否有限?

我正在使用cgget -n --values-only --variable memory.limit_in_bytes /在Docker容器中查看允许使用多less内存作为docker run --memory=X 但是,我需要知道内存是否有限制,这是没有回答上面的命令,因为它只会给我一个很大的数字(在我的testing9223372036854771712 )。

那么,有没有办法来判断记忆是否有限? 我正在寻找解决scheme,不需要以特殊方式运行docker run ,比如从主机上挂载文件(例如, /var/... )或传递一个环境variables。

你可以比较可用的总物理内存数量cgget给你。 如果cgget给出的cgget低于总物理内存,那么肯定知道用于限制内存的cgroup。

例如,如果我运行一个容器将内存限制在具有2G物理内存的计算机上,则cgget将报告104857600free命令报告2098950144个字节:

在docker上主持人:

 # free -b total used free shared buffers cached Mem: 2098950144 585707520 1513242624 712704 60579840 367644672 -/+ buffers/cache: 157483008 1941467136 Swap: 3137335296 0 3137335296 

启动一个容量限制为100M的容器

 docker run --rm -it --memory=100M <any-image-with-cgget-available> bash -l 

现在在这个容器中:

 # free -b total used free shared buffers cached Mem: 2098950144 585707520 1513242624 712704 60579840 367644672 -/+ buffers/cache: 157483008 1941467136 Swap: 3137335296 0 3137335296 # cgget -n --values-only --variable memory.limit_in_bytes / 104857600 

请注意, free命令将在docker主机上报告与容器内相同的值。

最后,下面的bash脚本定义了一个函数is_memory_limited ,它可以在一个testing中用来检查用来限制内存的cgroup。

 #!/bin/bash set -eu function is_memory_limited { type free >/dev/null 2>&1 || { echo >&2 "The 'free' command is not installed. Aborting."; exit 1; } type cgget >/dev/null 2>&1 || { echo >&2 "The 'cgget' command is not installed. Aborting."; exit 1; } type awk >/dev/null 2>&1 || { echo >&2 "The 'awk' command is not installed. Aborting."; exit 1; } local -ir PHYSICAL_MEM=$(free -m | awk 'NR==2{print$2}') local -ir CGROUP_MEM=$(cgget -n --values-only --variable memory.limit_in_bytes / | awk '{printf "%d", $1/1024/1024 }') if (($CGROUP_MEM <= $PHYSICAL_MEM)); then return 0 else return 1 fi } if is_memory_limited; then echo "memory is limited by cgroup" else echo "memory is NOT limited by cgroup" fi