数据库容器必须显式配置/dev/shm大小,否则默认64MB易致PostgreSQL(推荐512MB–1GB)、MySQL(高并发时建议256MB+)、TimescaleDB/Citus(1GB–2GB)等报“No space left on device”错误;需通过docker run --shm-size或docker-compose中shm_size设置,且避免与--ipc=host或自定义tmpfs冲突。

部署数据库容器时,共享内存(/dev/shm)大小必须显式配置,否则默认仅 64MB,容易导致 PostgreSQL、MySQL(尤其启用 InnoDB 多线程或并行查询时)、Redis 模块或某些 ORM 驱动报 No space left on device 错误——即使磁盘和内存都充足。
根据数据库类型设定合理 shm-size
不同数据库对共享内存的实际依赖差异较大,不能一概而论:
-
PostgreSQL:强烈建议设为
512m~1g。它使用 POSIX 共享内存管理 WAL 缓冲、后台进程通信及并行查询工作区;shared_buffers参数虽控制主缓冲池,但 IPC 通信仍依赖/dev/shm空间。 -
MySQL(8.0+):默认不强依赖
/dev/shm,但开启innodb_parallel_read_threads、使用 Memcached 插件,或运行在高并发 OLAP 场景下,建议至少256m;若搭配 Percona Toolkit 工具链或做逻辑备份(如mydumper),也常需增大。 -
TimescaleDB / Citus(基于 PG 扩展):按 PostgreSQL 基线再上浮 25%~50%,例如设为
1g~2g,因其分布式协调与批量数据加载更频繁使用共享内存段。
Docker CLI 与 Compose 的配置方式
该设置无法写入 Dockerfile,只能在运行时声明:
-
docker run 方式:
docker run -d --name pg-db --shm-size=1g -e POSTGRES_PASSWORD=pass postgres:15 -
Docker Compose 方式(v3.8+):
在服务定义中添加shm_size字段(注意不是shm-size):
services: db: image: postgres:15 shm_size: '1gb' environment: POSTGRES_PASSWORD: pass
避免常见冲突配置
以下组合会导致 --shm-size 失效,务必避开:
- 同时使用
--ipc=host:容器将直接复用宿主机的/dev/shm,此时自定义大小被忽略;如需可控大小,请保持默认--ipc=private(Docker 默认行为)。 - 挂载了
/dev/shm自定义 tmpfs:例如--tmpfs /dev/shm:rw,size=512m,会覆盖--shm-size;二者选其一即可,推荐用--shm-size更简洁明确。 - 在 Swarm 模式或 Kubernetes 中部署:Docker Compose 的
shm_size不生效,需改用deploy.resources.limits.memory配合容器运行时参数(如通过initContainer或 runtime-spec patch)。
验证是否生效
进入容器后执行三步检查:
-
df -h /dev/shm→ 查看挂载容量是否匹配设定值(如1.0G) -
mount | grep shm→ 输出中应含size=1048576k(即 1GB) -
ls -la /dev/shm→ 确认无异常大文件残留(长期运行的 DB 容器可能积累临时段,必要时可清空)


















