如何回收docker(卷)使用的磁盘空间,但保留一些重要的磁盘空间。docker是一个很好的工具,但它相当占用磁盘。在我的笔记本电脑上,它需要50克。这需要更多的时间,但是我的/var分区被限制为60G(其余的已经被各种Postgres数据库使用了…)。
所以我很早就学会了时不时地运行docker system prune(或者每次docker抱怨没有剩余空间,或者当一个项目因为postgres不能写入磁盘而崩溃时(给未来的我注意:将docker和postgres放在不同的分区上!))。Docker System Prune";删除未使用的数据";(根据文档)。它将删除所有停止的容器并构建缓存(位于磁盘上)、网络(不占用磁盘空间)和所有悬空图像(即未使用的图像)。
但它对我的作用越来越小。我不得不越来越频繁地运行码头系统修剪,回收的空间变得越来越小。
因此,我不得不调查并做一件很少做的事情:正确阅读文档!
在那里,我发现了--Volumes标志";,它还可以修剪";个卷。请注意,此标志是在Docker 17.06.1中添加的。默认情况下,旧版本的Docker会删除卷";。(这就是为什么在我一段时间前更新docker之前,事情就能正常工作)。
Docker system df(我在文档阅读狂欢中学到的另一个有用的命令)验证了我的大部分磁盘空间都被卷用完了。所以我运行了docker system prune--volumes,确认我想要删除所有这些内容,然后,嗯,docker删除了所有这些内容。
包括包含我目前未在使用的应用程序数据库的卷。这完全是公平的,因为这正是我命令它做的(删除所有卷,除非卷被正在运行的容器使用)。我现在有很多空闲空间,但是现在启动其中一个项目花了很长时间,因为docker首先必须重新创建数据库卷(虽然我试图保持我的开发数据库较小(~1G),但这仍然需要一段时间)。(在我的开发人员笔记本电脑上,我的坞站卷中没有任何真实/重要的数据,谢谢您的询问.)。
与当今大多数事情一样,您可以使用标签来标记卷。我还发现(在阅读了更多的文档后…)。还有另一个命令可以删除卷:docker volume prune。此命令可以根据标签(或没有标签)筛选要修剪的卷。因此,我现在的计划是标记我的数据库卷,并(不时)修剪所有缺少该标签的卷。
我的大多数项目都使用docker-compose,向由docker-compose管理的(数据库)卷添加标签非常简单:
我使用postgres映像和postgres数据目录的命名卷winxle_db定义了一个服务数据库。在VOLULES部分,我添加了一个名为DONT_AUTO_PRUNE的标签,但没有赋值(因此它的行为类似布尔)。
如果您真的想要查看标签,则必须使用这种非常难看的方式将模板传递给停靠卷:
对我来说,这看起来很像头盔图表(可能是因为它也使用了Golang模板,垃圾桶……),所以我快生病了。让我们快点向前看吧……。
Docker卷清理还采用--filter选项,因此我可以通过以下方式清理所有未设置标签的卷:
因为我不想费心记住这一点,也不想在谷歌上搜索它是怎么做的,结果只出现在我自己的博客上,所以我很快就添加了一个新的bash别名:
现在我所需要做的就是不时地运行docker-prune(或者当我的系统抱怨时),这样我就可以收回我的空闲空间,而不必等待几分钟来重建我昂贵的数据库卷!
下周四(6月25日,18:00CEST UTC+2)我将在云中的Perl大会上发表演讲,主题是为Perl应用程序编写一个好的Dockerfile。您可以通过Zoom参加讲座(如果您支付非常低的会议参会费),或者在YouTube/yapcna上观看直播。