首页 > 解决方案 > 如何通过给定配置的 **rest** api 推送 docker 映像

问题描述

我想通过仅提供部分数据在远程 docker 注册表中创建一个新图像:

根据文档 https://docs.docker.com/registry/spec/api/#pushing-an-image 为了推送 docker 映像,我可以:
* 发布我拥有的 tar 层。
*发布清单
,注册表将支持我的新图像。

例如:
* 我在本地有一个 tar 层中的 java 应用程序。
* 远程 docker 注册表已经有一个 java8 基础镜像。
* 我想上传 tar 层和引用 java8 基础映像的清单,并让 docker 注册表支持我的应用程序的新映像。

(如果有人关心的话,我从名为 Bazel 的第 3 方构建工具中获得的层 tar)

从我收集的文档中,我可以获取现有的 java8 图像清单,下载它,将我的新图层附加(或预先附加)到图层部分和中提琴。

查看清单规范 https://docs.docker.com/registry/spec/manifest-v2-2/#image-manifest-field-descriptions 我看到有一个带有摘要的“配置对象”部分作为对配置文件的引用。这是有道理的,例如,我可能需要重新定义入口点。所以假设我在一个文件中也有一个 docker 配置,我想我需要以某种方式让注册表知道。

API 中没有任何地方(我可以看到)说明在何处或如何上传配置,或者我是否需要这样做 - 也许它包含在层 tar 或其他东西中。

我是否将配置作为图层上传?它包含在焦油中吗?如果不是,为什么我要通过摘要引用它?

我希望的最佳答案是对 docker-registry 的一系列 http 调用,这些调用执行我正在尝试的操作。或者只是解释配置是什么,以及如何去做会很有帮助。

标签: restapidockerdocker-registry

解决方案


在这里找到了解决方案:
https
://www.danlorenc.com/posts/containers-part-2/ 非常详细,很好的答案,不知道你是谁,但我爱你!

通过检查现有图像中的一些配置,Docker 似乎需要一些字段:

{
  "architecture": "amd64",
  "config": {
  },
  "history": [
    {
      "created_by": "Bash!"
    }
  ],
  "os": "linux",
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:69e4bd05139a843cbde4d64f8339b782f4da005e1cae56159adfc92311504719"
    ]
  }
}  

config 部分可以包含环境变量、容器的默认 CMD 和 ENTRYPOINT 以及一些其他设置。rootfs 部分包含与我们的清单非常相似的层和 diff_id 列表。不幸的是,diff_ids 实际上与我们清单中包含的摘要略有不同,它们实际上是“未压缩”层的 sha256。

我们可以用这个脚本创建一个:

cat <<EOF > config.json
{
  "architecture": "amd64",
  "config": {
  },
  "history": [
    {
      "created_by": "Bash!"
    }
  ],
  "os": "linux",
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:$(gunzip layer.tar.gz --to-stdout | shasum -a 256 | cut -d' ' -f1)"
    ]
  }
}
EOF

配置上传配置基本上由注册表存储为普通 blob。它们在清单中的引用方式不同,但它们仍由摘要上传并正常存储。

我们用于图层的相同类型的脚本将在这里工作:

returncode=$(curl -w "%{http_code}" -o /dev/null \
    -I -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://gcr.io/v2/$PROJECT/hello/blobs/$config_digest)

if [[ $returncode -ne 200  ]]; then
    # Start the upload and get the location header.
    # The HTTP response seems to include carriage returns, which we need to strip
    location=$(curl -i -X POST \
        https://gcr.io/v2/$PROJECT/hello/blobs/uploads/ \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -d "" | grep Location | cut -d" " -f2 | tr -d '\r')

    # Do the upload
    curl -X PUT $location\?digest=$config_digest \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        --data-binary @config.json
fi

推荐阅读