假设我是软件供应商,我想将我的软件映像托管在我控制的容器注册表上,但想阻止这些映像被上传到其他公共或私有容器注册表进行分发。
与微软(和其他供应商)的做法非常相似;上传到私人注册表时,默认会跳过他们的“基础层”。
de5b52133faf: Pushed
d2425dc4f846: Skipped foreign layer
a7ba3db29ebb: Skipped foreign layer
Docker 如何知道这一点?换句话说,它是如何设置的?
答案1
如果你拉取这些图像的清单,你会看到这些层的 urls 字段已填充:
$ regctl image manifest --platform windows/amd64 golang
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 7024,
"digest": "sha256:ba630408bc63a555f6ad4fae6a2f5eab8fcba7cb050ac51b15d2e607f9fe8591"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip",
"size": 1718332879,
"digest": "sha256:4612f6d0b889cad0ed0292fae3a0b0c8a9e49aff6dea8eb049b2386d9b07986f",
"urls": [
"https://mcr.microsoft.com/v2/windows/servercore/blobs/sha256:4612f6d0b889cad0ed0292fae3a0b0c8a9e49aff6dea8eb049b2386d9b07986f"
]
},
{
"mediaType": "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip",
"size": 720933935,
"digest": "sha256:db4edcf0861ff3fdc41851a5a218965ecb2ab6cf4ec9448fb80cc4b6792fd46c",
"urls": [
"https://mcr.microsoft.com/v2/windows/servercore/blobs/sha256:db4edcf0861ff3fdc41851a5a218965ecb2ab6cf4ec9448fb80cc4b6792fd46c"
]
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 1362,
"digest": "sha256:433d24156d44dde3b3c6c0094ba5824a315286ae537c68f272e464fc426510f6"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 1387,
"digest": "sha256:2a2b02a688b62e8e70705b5d1eeaae912e44e9fb6dd72cfefc104982d61c555f"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 1329,
"digest": "sha256:d2bbc05d8cabd13ca38228cb52a2a4c1144c7a230b2c59e2e11b26f1f144f5dd"
},
...
您可以在图像规范描述符定义。我不知道有任何公共工具可以使用此字段生成清单。至少在使用docker build
或 buildkit 从 Dockerfile 构建时它不是一个选项。所以你可能正在编写自己的工具来生成这些图像。
从与微软员工的对话中我了解到,他们认为这是一个错误,并且正在努力从他们的镜像中撤消此错误,因为它破坏了工作流程。例如,任何处于断开连接的环境中的用户都无法使用常规工具拉取镜像。然而,可以使用简单的 curl 命令拉取图层本身,因此这并没有提供太多额外的安全性。