如何将图像标记为不可重新分发

如何将图像标记为不可重新分发

假设我是软件供应商,我想将我的软件映像托管在我控制的容器注册表上,但想阻止这些映像被上传到其他公共或私有容器注册表进行分发。

与微软(和其他供应商)的做法非常相似;上传到私人注册表时,默认会跳过他们的“基础层”。

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 命令拉取图层本身,因此这并没有提供太多额外的安全性。

相关内容