如何清理旧Docker映像

Angello Maggio
2022-12-27 12:28

清理旧的和未使用的Docker映像

有时我们积累了太多不再使用的图像,或者在很长一段时间内没有下载。然而,由于Docker和Artifactory基于校验和的存储的分层性质,这可能是一项棘手的任务。

描述

Docker存储在层中,每一层都存储有自己的校验和值。就像任何其他工件一样,Artifactory将基于该值存储层,导致层由不同的部署共享;不仅在不同的标签之间,而且在不同的图像之间。这意味着根据上一次下载日期删除一个层可能会导致清理问题。假设你正在使用REST APIAQL来查找旧的Docker映像,因此您可以运行查询来查找3个月以来未下载的所有工件。如果您随后删除这些工件,那么您可能仍然拥有长时间未使用的图像,并且现在是不完整的。这是因为一些层可能仍然被其他标签或图像使用,所以这些层没有被删除。在这一行中,我们还想清楚地说明,如果你从一张图像中删除了一个图层,只要其他图像引用它,它就不会被完全删除,所以我们必须关注的是删除整个图像。

决议

那么如何清理Docker呢?我们搜索基于manifest.json文件,也就是要更改的内容只有当特定的图像/标签被下载/使用时。

例如,下面的Python脚本将查找所有manifest.json删除4周或更长时间的文件并删除整个映像。运行脚本时要小心,因为它会删除文件,请确保先进行测试。

def clean_docker ():

进口的要求

Base_url = 'http://localhost:8081/artifactory/'

Headers = {
“内容类型”:“文本/普通”,

数据= ' items.find({"名称":{" $ eq”:“manifest.json”},“stat.downloaded”:{" $前":" 4 w "}})”

myResp =请求。Post (base_url+'api/search/aql', auth=('admin', 'password'), headers=headers, data=data)

eval(myrespe .text)["results"]:
Artifact_url = base_url+ result['repo'] + '/' + result['path']
requests.delete (artifact_url auth = admin,密码 ')) <----- [[[[[ 这将删除文件]]]]]]

如果__name__ == '__main__':
clean_docker ()

你也可以使用JFrog的CLI来删除文件。在这种情况下,您可以在规范文件中指定目标和过滤。然后你可以这样运行CLI:

jfrog rt del——spec=

在这种情况下,规范文件的示例如下所示

{"files": [{

" aql ": {

”项。查找":{

“回购”:“< DOCKER_REPO_NAME >”,

“美元和“:[{

“创建”:{" $前":" 4 w "},

}}}}]}
你可以用stat.downloaded字段查找最近没有使用过的文件(参见更多字段在这里,记得把它们当作domain.field)连同相对时间算子去年美元(例如在最后的4周)或美元之前(例如,下载之前4周前)。你也可以把它们放在一起做一个范围复合标准美元和美元或).