这周正在做APIcat的企业版研发,准备适配阿里云的计算巢提供企业直接云安装的功能,顺便把原来写过的一个直接下载docker镜像包的小程序挂到了Gitee上面,有需要的可以点击下载

https://gitee.com/extrame/dgeticon-default.png?t=N176https://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 Exchangeicon-default.png?t=N176https://devops.stackexchange.com/questions/2731/downloading-docker-images-from-docker-hub-without-using-docker我照着这些指引,前段时间就写了这个小程序。

最近是因为好多国产系统架构都改了,发现docker hub的多架构支持,原来我的程序不支持,又把这块加了进去。就干脆改了开源,有需要的直接用。

主要功能

输入包名和版本号,下载docker image

  1. 支持本地缓存,下载好的layer不再重复下载
  2. 直接打包gz包,用于后续的docker load
  3. 支持多架构选择,使用参数-arch可以指定想下载的系统和架构
  4. 支持仅打印信息的打印模式

程序说明

程序还是非常简单的,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 JSON
  • application/vnd.docker.image.rootfs.diff.tar.gzip: “Layer”, as a gzipped tar
  • application/vnd.docker.image.rootfs.foreign.diff.tar.gzip: “Layer”, as a gzipped tar that should never be pushed
  • application/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包的模式,没研究过,可能能更快

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐