我已经成功地将一个大型数据库备份文件(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并不能解决问题。既然已删除文件以获取足够的空间,我该如何缩小呢?
答案 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 export
到docker import
用管道输送:
docker export <CONTAINER ID> | docker import - flatten-container:latest