这周正在做APIcat的企业版研发,准备适配阿里云的计算巢提供企业直接云安装的功能,顺便把原来写过的一个直接下载docker镜像包的小程序挂到了Gitee上面,有需要的可以点击下载
主要用处是不用下载和安装完整的docker程序,直接使用这个工具下载docker镜像文件。
众所周知,docker安装还是挺复杂的事情,windows下还需要wsl的支持,安装后还非常耗资源,有时候还有些莫名其妙的冲突,我就出现过和暗黑有时候会冲突的情况。
而docker hub的镜像下载,是只能使用docker pull进行的,这样就造成本来我们只想下一个image取服务器安装,但是不得不在本机安装庞大的docker来仅仅做一个pull的窘境。
所以我上网搜了一下,确实有很多人有类似的需求:
最近是因为好多国产系统架构都改了,发现docker hub的多架构支持,原来我的程序不支持,又把这块加了进去。就干脆改了开源,有需要的直接用。
主要功能
输入包名和版本号,下载docker image
程序还是非常简单的,docker下载基本就是个http客户端的事情,倒是没多复杂,所以程序里除了一个cmd的入口之外,主要就是个install.go。
install.go里面主要就是多次的http请求以及对应的json数据的Marshall和Unmarshall。
docker hub的http请求设计的很有意思,他在同样使用hash id表示docker包之外,用Accept来达到客户端获取不同内容的目的。
例如:
application/vnd.docker.distribution.manifest.list.v2+json : 获取该软件包的信息列表
application/vnd.docker.distribution.manifest.v2+json: 获得该架构的具体信息
官方解释包含以下几种:
application/vnd.docker.distribution.manifest.v1+json
: schema1 (existing manifest format)application/vnd.docker.distribution.manifest.v2+json
: New image manifest format (schemaVersion = 2)application/vnd.docker.distribution.manifest.list.v2+json
: Manifest list, aka “fat manifest”application/vnd.docker.container.image.v1+json
: Container config JSONapplication/vnd.docker.image.rootfs.diff.tar.gzip
: “Layer”, as a gzipped tarapplication/vnd.docker.image.rootfs.foreign.diff.tar.gzip
: “Layer”, as a gzipped tar that should never be pushedapplication/vnd.docker.plugin.v1+json
: Plugin config JSON
这用法稍微有些阴间了,这不是一个很容易让人理解的通用做法,这个是不是符合RESTful标准也很难说。
总之,基本的下载逻辑就先获得客户端token,然后获得application/vnd.docker.distribution.manifest.list.v2+json里面的包信息列表,列表的条目里会包含支持的不同系统和架构,再选择对应需要的进入下一步下载。
下一步下载就是直接把Accept设置成
application/vnd.docker.distribution.manifest.v2+json下载对应包的内容,再分层下载包的依赖包。
下载完成的都放到同一个文件夹,最后打包成一个tar.gz就行了。
有感兴趣代码的可以看intall.go
看这个官方说明,可能有直接下载gz包的模式,没研究过,可能能更快
原文链接:https://blog.csdn.net/baijiafan/article/details/129077647?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171836840916800182116382%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171836840916800182116382&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-26-129077647-null-null.nonecase&utm_term=docker%E3%80%81%E5%A5%BD%E7%94%A8