如何在给定配置下通过**rest**api推送docker镜像

如何在给定配置下通过**rest**api推送docker镜像,rest,api,docker,docker-registry,Rest,Api,Docker,Docker Registry,我想通过仅提供部分数据在远程docker注册表中创建新映像: 根据文件 为了推送docker映像,我可以: *张贴我的焦油层。 *发布清单 注册表将支持我的新图像 例如: *我在tar层中本地有一个java应用程序。 *远程docker注册表已具有java8基本映像。 *我想上传tar层和引用java8基本映像的清单,并让docker注册表支持我的应用程序的新映像 (如果有人在意,我从第三方构建工具Bazel获得的层tar) 从我收集的文档中,我可以获取现有的java8图像清单,下载它,将我的新

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

根据文件 为了推送docker映像,我可以:
*张贴我的焦油层。
*发布清单
注册表将支持我的新图像

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

(如果有人在意,我从第三方构建工具Bazel获得的层tar)

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

查看清单规范 我看到有一个“配置对象”部分,其中摘要是对配置文件的引用。这是有道理的,例如,我可能需要重新定义入口点。因此,假设我在一个文件中也有一个docker配置,我想我需要让注册表知道

API中没有任何地方(我可以看到)说明在哪里或如何上传配置,或者我是否需要上传配置——也许它包含在tar层或其他什么东西中

我是否将配置作为层上传?焦油里有吗?如果不是,为什么我要在《文摘》中提到它


我所希望的最佳答案是对docker注册表的一系列http调用,这些调用完成了我正在尝试的工作。或者只是解释一下配置是什么,以及如何进行配置将非常有帮助。

在这里找到了解决方案:

非常详细,回答很好,不知道你是谁,但我爱你

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

{
  "architecture": "amd64",
  "config": {
  },
  "history": [
    {
      "created_by": "Bash!"
    }
  ],
  "os": "linux",
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:69e4bd05139a843cbde4d64f8339b782f4da005e1cae56159adfc92311504719"
    ]
  }
}  
config部分可以包含环境变量、容器的默认CMD和入口点以及一些其他设置。rootfs部分包含一个层和diff_id的列表,它们看起来非常类似于我们的清单。不幸的是,diff_id实际上与清单中包含的摘要略有不同,它们实际上是“未压缩”层的一部分

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

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
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