Docker 的 shm-size 参数用于设置容器内 /dev/shm 共享内存大小,默认仅 64MB,易导致 TensorFlow、PyTorch 等多进程应用因共享内存不足报错;需通过 docker run --shm-size=2g 等方式显式指定,不支持 Dockerfile 声明,且独立于内存限制。

Docker 的 shm-size 参数用于设置容器内 /dev/shm 文件系统的大小,默认只有 64MB。当运行依赖大量共享内存的应用(如 TensorFlow、PyTorch 多进程数据加载、OpenCV 的某些操作或数据库临时共享结构)时,容易触发 no space left on device 错误——其实不是磁盘满,而是共享内存耗尽。
为什么需要调整 shm-size
/dev/shm 是基于内存的 tmpfs 文件系统,供进程间高效共享数据。Docker 默认限制为 64MB,远低于许多深度学习框架单次数据批处理所需(例如多 worker 的 DataLoader 可能需数 GB)。不调整会导致:
- Python 多进程报
OSError: unable to mmap 131072 bytes - TensorFlow 报
Failed to create shared memory region - 容器内
df -h /dev/shm显示已用 100%
如何在 docker run 中设置 shm-size
使用 --shm-size 选项,支持字节(b)、千字节(k/K)、兆字节(m/M)、吉字节(g/G)单位:
-
docker run --shm-size=2g my-image→ 分配 2GB 共享内存 -
docker run --shm-size=512m my-image→ 分配 512MB -
docker run --shm-size=1073741824 my-image→ 等价于 1g(字节数)
注意:该参数必须写在 docker run 命令中,不能在 Dockerfile 中声明;也不受 --memory 限制影响,它是独立的 tmpfs 配置。
验证和调试方法
进入容器后,可通过以下方式确认生效:
-
df -h /dev/shm—— 查看挂载大小是否匹配设定值 -
mount | grep shm—— 输出类似shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=2097152k),其中size=后数值单位为 KB -
ls -lh /dev/shm—— 检查是否有异常残留文件(长期运行容器可能积累,可手动清理)
配合其他参数使用的注意事项
若同时使用 --ipc=host,则容器会复用宿主机的 /dev/shm,此时 --shm-size 将被忽略。如需自定义大小,应避免 --ipc=host,改用默认的 --ipc=private(Docker 默认行为)。另外,在 Docker Compose 中对应字段为:
services:
app:
image: my-image
shm_size: 2gb










