以alpine镜像为例测试
先将alpine镜像pull到本地
然后在registry中找到alpine镜像的manifest并修改内容
原内容:
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1472,
"digest": "sha256:b2aa39c304c27b96c1fef0c06bee651ac9241d49c4fe34381cab8453f9a89c7d"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 3374446,
"digest": "sha256:63b65145d645c1250c391b2d16ebe53b3747c295ca8ba2fcb6b0cf064a4dc21c"
}
]
}
修改后:
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1472,
"digest": "sha256:b2aa39c304c27b96c1fef0c06bee651ac9241d49c4fe34381cab8453f9a89c7d"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 5164893,
"digest": "sha256:e4e46864aba2e62ba7c75965e4aa33ec856ee1b1074dda6b478101c577b63abd"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 3374446,
"digest": "sha256:63b65145d645c1250c391b2d16ebe53b3747c295ca8ba2fcb6b0cf064a4dc21c"
}
]
}
再将下载到本地的alpine镜像push到registry中
查看manifest:
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1472,
"digest": "sha256:b2aa39c304c27b96c1fef0c06bee651ac9241d49c4fe34381cab8453f9a89c7d"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 5164893,
"digest": "sha256:e4e46864aba2e62ba7c75965e4aa33ec856ee1b1074dda6b478101c577b63abd"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 3374446,
"digest": "sha256:63b65145d645c1250c391b2d16ebe53b3747c295ca8ba2fcb6b0cf064a4dc21c"
}
]
}
没有变化,说明只修改manifest上传不会对旧的镜像有任何改变,或者上传镜像后registry识别镜像的依据不是manifest。
下载一个bash镜像tag成alpine再上传
发现在本地tag两个相同的镜像名的时候旧的镜像tag会变成none
上传后alpine的_manifest目录如图所示
可以看到旧的e2e168...依然存在,新的3b538...加了进来并且在current目录下的link中是新的3b538...
客户端清理后pull alpine镜像
下载了三个层,说明是下载的新的alpine(原本的alpine只有一个层)
执行registry的垃圾回收命令后旧的alpine还是存在。
结论
所以说registry收到镜像名完全相同的镜像后并不会完全覆盖掉旧的镜像,而是将新的镜像视为旧镜像的新版本存储,就得镜像依然存在,只是我们无法再下载到。这样不会导致很多垃圾吗?
我觉得还有其他机制,待更新。