从Docker容器中删除文件后回收磁盘空间

时间:2018-07-30 19:05:46

标签: docker

我已经成功地将一个大型数据库备份文件(35 GB)复制到了Docker容器中,并在本地还原了我的数据库(遵循this walkthrough)。我现在想从Docker容器中删除该.bak文件以回收空间。我是通过运行sudo docker exec sql_server rm -rf /var/opt/mssql/backup/example.bak来做到这一点的,但这并没有回收空间-我的Docker.raw文件仍然保留约76 GB。当我运行docker system df时,它说我的容器为45 GB。我尝试了docker system prune -a,但此操作回收了0B。重新启动Docker并不能解决问题。既然已删除文件以获取足够的空间,我该如何缩小呢?

2 个答案:

答案 0 :(得分:2)

  

我是通过运行sudo docker exec sql_server rm -rf /var/opt/mssql/backup/example.bak来做到这一点的,但这并没有回收空间

是否释放空间取决于文件仅存在于容器中还是图像中存在。图像中存在文件后,将其删除在容器中不会修改图像本身。取而代之的是,只有容器文件系统被更新,并带有从该容器的视图中删除该文件的指示。这就是分层文件系统在后台运行的方式。

  

我运行docker system df时说我的容器是45 GB

您可以对此进行更深入的研究。对于任何特定的容器,您可以在容器ID上运行docker container diff命令,以查看在该容器内已被修改的文件。

  

我尝试了docker system prune -a,但是回收了0B。

这不会从正在运行的容器中回收空间。如果容器已停止,它将被删除,并且如果没有其他指向该容器的图像,则也可能会删除启动该容器的映像。否则,docker将避免运行容器,并且无法对其进行修剪,而可以对正在运行的容器中的文件运行。

  

我的Docker.raw文件仍然保留约76 GB

这是非常关键的一点,它表明您正在Mac上运行Docker。以上所有步骤可能会减少Docker在其上运行的Linux环境的磁盘空间。但是,Docker在Mac和Windows上使用的VM映射到一个文件,该文件会随VM的需要而增长。在Docker for Mac FAQ中,此文件报告的磁盘空间可能不正确,因为在Mac上稀疏文件无法工作:

  

Docker.raw消耗了大量的磁盘空间!

     

这是一种幻想。 Docker在运行Windows的Mac上使用原始格式   苹果文件系统(APFS)。 APFS支持稀疏文件,该文件会压缩   长期的零表示未使用的空间。 ls的输出是   具有误导性,因为它列出了文件的逻辑大小而不是   它的物理尺寸。要查看物理大小,请添加-ks开关;至   以易读的形式查看逻辑大小,请添加-lh:

$ cd ~/Library/Containers/com.docker.docker/Data/vms/0
$ ls -klsh Docker.raw
2333548 -rw-r--r--@ 1 akim  staff    64G Dec 13 17:42  Docker.raw
     

在此列表中,逻辑大小为64GB,但物理大小为   只有2.3GB。

     

或者,您可以使用du(磁盘使用情况):

$ du -h Docker.raw
2,2G  Docker.raw

我还建议通过以下方法查看Docker VM内部使用了多少磁盘空间:

sudo docker run --rm -v /var/lib/docker:/host/var/lib/docker:ro \
  busybox df -h /host/var/lib/docker

答案 1 :(得分:0)

根据此article,您可以使用以下方法展平容器:

# export the container to a tarball
docker export <CONTAINER ID> > /home/export.tar

# import it back
cat /home/export.tar | docker import - some-name:latest

docker export将容器的文件系统导出为tar归档文件,docker import从tarball导入内容以创建文件系统映像。

您可以通过以下方式直接从docker exportdocker import用管道输送:

docker export <CONTAINER ID> | docker import - flatten-container:latest