Docker commit推送的镜像拉取后无存储文件,如何保留提交的文件?
错误原因
Docker commit 命令只会保存容器自身联合文件系统中产生的变更,你在docker-compose中配置的/01_VOL1:/srv属于宿主机绑定挂载卷(Bind Mount),/srv目录的读写完全直接对接原服务器的/01_VOL1目录,不会写入容器的文件系统层,因此commit操作不会将上传的文件打包到镜像中,新服务器拉取的镜像自然不包含之前的上传内容。
解决方案
分为两种实现路径,按需选择:
路径1:将文件打包到镜像内同步分发(适合静态不常更新的文件)
- 停止原运行中的filebrowser容器,将原服务器
/01_VOL1目录下的所有文件复制到本地构建目录 - 编写Dockerfile,示例如下:
# 基础镜像使用你原有的filebrowser镜像 FROM xxxxdocker/xxxrepo:browser_v1 # 将本地文件复制到镜像内的/srv目录 COPY ./本地文件路径 /srv
- 执行
docker build -t xxxxdocker/xxxrepo:browser_v2 .构建新镜像,打tag后推送到DockerHub,新服务器拉取该镜像启动即可看到内置的文件 - 注意:该方式下后续在容器内新上传的文件依然不会自动同步到镜像,每次需要更新文件都要重新构建镜像
路径2:数据与镜像分离(生产环境推荐)
该方案无需修改镜像,符合容器化最佳实践:
- 将原服务器
/01_VOL1目录下的所有内容完整迁移到新服务器的/01_VOL1路径下 - 直接使用你原有docker-compose配置在新服务器启动容器即可,所有上传文件都可以正常读取
- 后续升级镜像、迁移环境都不会影响业务数据,维护成本更低
补充说明
不建议使用
docker commit方式制作自定义镜像,commit生成的镜像无构建过程可追溯,存在冗余内容、安全性低等问题,所有自定义镜像都建议通过Dockerfile方式构建。
内容的提问来源于stack exchange,提问作者Umesh Kumar
相关产品推荐
相关产品推荐

