如何清理旧Docker映像
清理旧的和未使用的Docker映像
有时我们积累了太多不再使用的图像,或者很长一段时间没有下载。然而,由于Docker和Artifactory基于校验和存储的分层特性,这可能是一项棘手的任务。
描述
Docker是分层存储的,每一层都存储有自己的校验和值。就像任何其他工件一样,Artifactory将基于此值存储层,从而使层由不同的部署共享;不仅在不同的标签之间,而且在不同的图像之间。这意味着基于最后一次下载日期删除一个层可能会导致问题清理。假设你在用REST API或AQL查找基于最少使用的旧Docker映像,因此您运行查询以查找自3个月以来未下载的所有工件。如果您删除了这些工件,那么您可能仍然有很长时间没有使用的图像,并且现在是不完整的。这是因为有些图层可能仍然被其他标签或图像使用,所以这些图层没有被删除。在这一行,我们也想要明确,如果你从一个图像中删除一个图层,只要其他图像引用它,它就不会被完全删除,所以我们必须关注的是将该图像作为一个整体删除。
决议
那么如何清理Docker呢?我们根据manifest.json文件,即要更改的内容只有当下载/使用特定图像/标签时。
例如,下面的Python脚本将查找所有manifest.json4周或更长时间的文件,并删除整个图像。运行脚本时要小心,因为它会删除文件,确保先进行测试。
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(myrespp .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=< myspec >
在这种情况下,规范文件的示例如下
{"files": [{
" aql ": {
”项。查找“:{”
“回购”:“< DOCKER_REPO_NAME >”,
“美元和“:[{
“创建”:{" $前":" 4 w "},
}}}}]}
你可以用"created"代替"created"stat.downloaded字段查找最近未使用的选项(参见这里有更多的字段,记得用asdomain.field)与…一起相对时间算子如去年美元(例如下载于最后的4周)或美元之前(例如,下载之前4周前)。你也可以把它们放在一起做成一个系列复合标准(美元和美元或).
