如何限制Docker容器中挂载文件夹的存储空间?
限制Docker容器挂载目录大小的可行方案
你之前在容器内尝试创建虚拟文件系统的方法失效,主要是因为容器默认没有CAP_SYS_ADMIN权限,挂载、格式化这类操作需要特权,普通容器无法执行(除非加--privileged,但这会带来安全风险,不推荐)。下面给你几个更安全且可行的方案:
方案1:使用Docker本地卷(Volume)设置大小限制
Docker支持对本地卷直接设置容量上限,前提是你的Docker存储驱动支持配额(比如overlay2、devicemapper,大部分现代环境都满足)。
步骤如下:
- 先创建一个带大小限制的卷(比如限制为500MB):
若上述命令在你的环境不生效,可尝试更明确的写法:docker volume create --name my_quota_volume --opt size=500mdocker volume create --driver local --opt type=ext4 --opt device=/dev/loop0 --opt o=size=500m,loop my_quota_volume - 运行容器时挂载这个卷:
docker run -t --name a6f97966d3a2552283df -v my_quota_volume:/usercode ubuntu_16_04:firsttry /usercode/script.sh
方案2:宿主机预创建带配额的挂载点,再挂载到容器
既然容器内操作受限,我们可以把配额设置在宿主机上,再把这个受限目录挂载到容器里:
- 在宿主机上创建一个用于配额的镜像文件:
fallocate -l 500M /var/virtual_disks/directory_with_size_limit.ext4 mkfs.ext4 /var/virtual_disks/directory_with_size_limit.ext4 - 创建宿主机挂载目录并挂载镜像文件:
mkdir -p /temp/a6f97966d3a2552283df mount -o loop,rw /var/virtual_disks/directory_with_size_limit.ext4 /temp/a6f97966d3a2552283df - 现在运行容器挂载这个目录,容器内的写入就会受到500MB的限制:
如果需要开机自动挂载,可以把挂载信息加到docker run -t --name a6f97966d3a2552283df -v "/temp/a6f97966d3a2552283df":/usercode ubuntu_16_04:firsttry /usercode/script.sh/etc/fstab里。
方案3:使用tmpfs挂载(适合临时文件/日志,无需持久化)
如果你的脚本生成的文件和日志不需要持久化到磁盘,只是运行时临时存储,那么可以用tmpfs,它直接在内存中存储,还能设置大小限制:
运行容器时直接指定tmpfs挂载:
docker run -t --name a6f97966d3a2552283df --tmpfs /usercode:size=500m ubuntu_16_04:firsttry /usercode/script.sh
或者用--mount语法:
docker run -t --name a6f97966d3a2552283df --mount type=tmpfs,destination=/usercode,tmpfs-size=500m ubuntu_16_04:firsttry /usercode/script.sh
注意:容器停止后,tmpfs里的内容会被清空,适合不需要持久化的场景。
内容的提问来源于stack exchange,提问作者Himanshu




