我想通过仅提供部分数据在远程Docker注册表中创建新映像:
根据文档
https://docs.docker.com/registry/spec/api/#pushing-an-image
为了推送docker映像,我可以:
*发布我拥有的tar层。
*发布清单
注册表将支持我的新新映像。
例如:
*我在tar层中本地有一个Java应用。
*远程Docker注册表已经具有java8基本映像。
*我想上传tar层和一个引用java8基本映像的清单,并让docker Registry支持我的应用程序的新映像。
(如果有人关心的话,我可以从名为Bazel的第三方构建工具获得该图层tar)
从我收集的文档中,我可以获取现有的java8图像清单,下载它,将我的新图层附加(或预先添加)到“图层”部分和中提琴。
查看清单规范 https://docs.docker.com/registry/spec/manifest-v2-2/#image-manifest-field-descriptions 我看到有一个“配置对象”部分,其中摘要是对配置文件的引用。这很有道理,例如,我可能需要重新定义入口点。因此,假设我在文件中也有一个docker config,我想我需要让注册表知道某种方式。
API的任何地方(我都能看到)都没有说明上传配置的位置或方式,或者根本不需要执行该操作-也许它包含在tar或其他内容中。
我是否将配置上传为图层?它包含在焦油中吗?如果不是,为什么我要通过摘要对其进行引用?
我能希望的最佳答案是对docker-registry执行我正在尝试的一系列HTTP调用。另外,仅说明配置是什么,以及如何进行配置也会很有帮助。
答案 0 :(得分:0)
在这里找到解决方案:
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