这周正在做APIcat的企业版研发,准备适配阿里云的计算巢提供企业直接云安装的功能,顺便把原来写过的一个直接下载docker镜像包的小程序挂到了Gitee上面,有需要的可以点击下载
https://gitee.com/extrame/dgethttps://gitee.com/extrame/dget
主要用处是不用下载和安装完整的docker程序,直接使用这个工具下载docker镜像文件。
众所周知,docker安装还是挺复杂的事情,windows下还需要wsl的支持,安装后还非常耗资源,有时候还有些莫名其妙的冲突,我就出现过和暗黑有时候会冲突的情况。
而docker hub的镜像下载,是只能使用docker pull进行的,这样就造成本来我们只想下一个image取服务器安装,但是不得不在本机安装庞大的docker来仅仅做一个pull的窘境。
所以我上网搜了一下,确实有很多人有类似的需求:
dockerhub - Downloading Docker Images from Docker Hub without using Docker - DevOps Stack Exchangehttps://devops.stackexchange.com/questions/2731/downloading-docker-images-from-docker-hub-without-using-docker我照着这些指引,前段时间就写了这个小程序。
最近是因为好多国产系统架构都改了,发现docker hub的多架构支持,原来我的程序不支持,又把这块加了进去。就干脆改了开源,有需要的直接用。
主要功能
输入包名和版本号,下载docker image
- 支持本地缓存,下载好的layer不再重复下载
- 直接打包gz包,用于后续的docker load
- 支持多架构选择,使用参数-arch可以指定想下载的系统和架构
- 支持仅打印信息的打印模式
程序说明
程序还是非常简单的,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包的模式,没研究过,可能能更快