因此,我个人建议将此操作作为映像和容器的部署脚本的一部分,仅保留最新的n个容器和映像。我使用与我使用的相同版本控制架构标记Docker映像,git tag
并始终使用“最新”标记最新的Docker映像。这意味着在不清理任何内容的情况下,我的Docker映像看起来像:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
some_repo/some_image 0.0.5 8f1a7c7ba93c 23 hours ago 925.4 MB
some_repo/some_image latest 8f1a7c7ba93c 23 hours ago 925.4 MB
some_repo/some_image 0.0.4 0beabfa514ea 45 hours ago 925.4 MB
some_repo/some_image 0.0.3 54302cd10bf2 6 days ago 978.5 MB
some_repo/some_image 0.0.2 0078b30f3d9a 7 days ago 978.5 MB
some_repo/some_image 0.0.1 sdfgdf0f3d9a 8 days ago 938.5 MB
现在,我当然不想让我所有的图像(或容器)都恢复到我所有生产包装盒上的永久性。我只希望最后3或4个回滚,并摆脱其他所有问题。Unix tail
是您最好的朋友。由于docker images
和docker ps
两者都按日期排序,因此我们可以使用tail
来选择除前三个以外的所有内容并将其删除:
docker rmi $(docker images -q | tail -n +4)
与您的部署脚本一起(或在本地)运行该脚本,以始终保留足够的映像以舒适地回滚,而不会占用过多的空间或使旧映像混乱。
就个人而言,我随时只能在生产盒上保留一个容器,但是如果您想要更多,则可以对容器执行相同的操作:
docker rm $(docker ps -aq | tail -n +4)
最后,在我的简化示例中,我们一次只处理一个存储库,但是如果您拥有更多的存储库,那么使用相同的思想就可以变得更加复杂。说我只想保留some_repo / some_image中的最后三个图像。我可以在混合grep
和awk
和我的路:
docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)
同样,相同的想法也适用于容器,但是到这一点您已经明白了,所以我将不再给出示例。