Docker是否会自动删除容器内/tmp目录下的文件?
结论
Docker引擎本身不会主动删除处于运行状态的容器内部/tmp目录的文件,你遇到的文件丢失,基本是容器内系统机制、应用逻辑或者容器生命周期变动导致的。
常见原因
- 容器内系统自带的临时文件清理机制
几乎所有主流Linux基础镜像(Debian/Ubuntu/CentOS/RHEL等)默认都开启了临时文件自动清理规则:- Debian/Ubuntu系默认预装
tmpreaper,通过每日定时任务清理/tmp下超过3天没被访问过的文件,这个默认时间和你遇到的3-4天文件丢失的场景完全匹配 - CentOS/RHEL系默认靠
systemd-tmpfiles-clean.timer定时触发清理,默认规则是删除/tmp下10天未访问的文件,部分裁剪过的精简镜像可能会把这个时间阈值调得更短
- Debian/Ubuntu系默认预装
- 容器发生过重启或者重建
容器的可写层数据是和单个容器实例强绑定的,如果容器因为进程崩溃、宿主机重启、编排系统调度被重建过,旧容器实例里/tmp存的所有文件都会跟着旧实例一起消失,新启动的容器的/tmp是完全干净的初始状态。哪怕你配置了自动重启策略,只要容器实例被重新创建,可写层的旧数据就不会保留。 - Node.js应用自身或者依赖包的清理逻辑
很多处理文件上传、格式转换、临时缓存的Node.js依赖(比如multer、各类图片处理库)默认会把临时文件存在/tmp,不少依赖自带定时清理过期临时文件的逻辑;要是代码里写了没注意到的定时清理逻辑,也会主动删掉对应文件。
排查和解决方法
- 第一步先确认容器有没有重启过:执行
docker inspect <你的容器ID/名称> | grep -A5 RestartCount查看重启计数,如果计数大于0,先排查重启原因。记住一个核心原则:所有需要持久化的业务数据都不要放在容器可写层,必须挂载Docker Volume或者绑定宿主机目录存储。 - 如果确认容器从来没重启过,进入容器检查系统清理规则:Debian/Ubuntu系执行
cat /etc/tmpreaper.conf查看默认清理时长,CentOS/RHEL系执行systemctl cat systemd-tmpfiles-clean.timer查看定时清理规则,确认时间规则是不是和文件丢失的时间对得上。如果确实需要在/tmp存更久的临时文件,可以调整清理阈值,或者构建镜像的时候直接移除对应的清理组件,比如Debian系可以在Dockerfile里加RUN apt-get remove -y tmpreaper && rm -f /etc/cron.daily/tmpreaper直接禁用默认清理。 - 排查Node.js的代码和依赖配置,看看有没有主动清理
/tmp目录的逻辑,业务生成的临时文件最好自行维护生命周期,用完主动删除,别完全依赖系统的默认清理规则。
补充说明:Linux的
/tmp目录本身设计目的就是存储短生命周期的临时文件,不管是不是在容器环境里,都不适合存需要长期保留、不能丢失的业务数据。
内容的提问来源于stack exchange,提问作者piyush
相关产品推荐
相关产品推荐

