MongoDB Docker容器启动失败:无法写入PID文件,设备无剩余空间
MongoDB容器启动后立即退出,日志提示"Cannot write pid file to /tmp/...: No space left on device"
问题描述
我通过以下命令启动MongoDB容器:
docker run -d -p 27017:27017 --net=cdt-net --name cdt-mongo mongo
但容器很快退出,查看容器状态显示:
0e35cf68a29c mongo "docker-entrypoint.s…" Less than a second ago Exited (1) 3 seconds ago cdt-mongo
查看Docker日志输出如下:
$ docker logs 0e35cf68a29c about to fork child process, waiting until server is ready for connections. forked process: 21 2018-01-12T23:42:03.413+0000 I CONTROL [main] ***** SERVER RESTARTED ***** 2018-01-12T23:42:03.417+0000 I CONTROL [main] ERROR: Cannot write pid file to /tmp/tmp.aLmNg7ilAm: No space left on device ERROR: child process failed, exited with error number 1
请问该错误是什么原因?是否是容器内存储空间不足?
问题原因与解决办法
先给你明确结论:这个问题不是容器内部存储空间不足,而是你的宿主机磁盘(具体是/tmp所在的分区)已经被占满了。
MongoDB启动过程中需要在容器的/tmp目录写入pid文件,但Docker容器默认会和宿主机共享磁盘资源,当宿主机的对应分区没有剩余空间时,容器自然没办法完成写入操作,直接启动失败退出了。
你可以按下面的步骤来排查和解决:
- 第一步:检查宿主机的磁盘使用情况,执行这条命令:
看输出里df -h/分区(或者/tmp所在的分区)的使用率,大概率是已经100%占用了。 - 第二步:清理空间释放资源:
- 可以先清理Docker的闲置资源,比如没用的镜像、停止的容器、未使用的卷,用这条命令一键清理:
注意:执行前确认这些闲置资源你都不需要了,避免误删有用的内容。docker system prune -a - 另外直接清理宿主机
/tmp目录下的临时文件也是个快速释放空间的办法:
或者用系统自带的sudo rm -rf /tmp/*tmpwatch这类工具来自动清理过期临时文件。
- 可以先清理Docker的闲置资源,比如没用的镜像、停止的容器、未使用的卷,用这条命令一键清理:
- 第三步:清理完空间后重新启动MongoDB容器,应该就能正常运行了。
如果你想彻底避免这种依赖宿主机/tmp空间的问题,还可以在启动容器时给/tmp挂载一个内存临时文件系统,这样就不会占用磁盘空间了,启动命令改成这样:
docker run -d -p 27017:27017 --net=cdt-net --name cdt-mongo --tmpfs /tmp mongo
内容的提问来源于stack exchange,提问作者user7898461
相关产品推荐
相关产品推荐

