吃枣药丸

吃枣药丸

[開源]docker-tar: 可以直連DockerHub的Docker tar映像下載小工具

介紹#

docker-tar 是一個用於從 Docker 倉庫拉取鏡像並自動打包為 Tar 包的工具。
Github: docker-tar

特點#

  • 無需 Docker 環境:二進制中包含了所有功能,開箱即用
  • 多操作系統運行: 提供相關二進制,LinuxWindowsMacOSSolarisOpenBSD等操作系統均可使用,更多支持操作系統見 Release
  • 多處理器架構運行:提供相關二進制,支持amd64/x64i386/x86armarm64mipsppc64等處理器架構,你可以使用 PC 甚至是路由器來運行此工具,更多支持架構見 Release
  • 鏡像模式下載:鏡像站點下載的鏡像 tar 無需進行 tag,可保持和輸入的鏡像名稱一致
  • 登錄下載:支持需要認證的 Docker 倉庫及其鏡像站
  • 選擇鏡像架構:支持選擇下載具有多架構的 Docker 鏡像
  • 更接近 Docker CLI 的下載結果:此工具下載的 tar 鏡像文件,與使用 docker pulldocker save保存的文件完全一致
  • 實驗室模式:提供解決 DNS 污染和 SNI 阻斷的實驗室模式,幫助你直連某些無法訪問的 Docker 倉庫站點

命令行使用說明#

-action action
        pull: 拉取鏡像tar文件.
        list: 列出可以拉取的處理器架構鏡像
  -arch architecture
        指定需要拉取的鏡像架構 (默認值為 "amd64")
  -image name
        需要下載的鏡像信息
        不攜帶版本默認為latest
        默認使用 DockerHub Docker 倉庫
        nginx
        home-assistant/home-assistant:stable
        ghcr.io/home-assistant/home-assistant:stable
  -output filename
        輸出 tar 鏡像的文件名,不指定此選項將隨機生成文件名
   -username username
        Docker 倉庫/鏡像站點需要登錄時,需要提供用戶名
  -password password
        Docker 倉庫/鏡像站點需要登錄時,需要提供密碼
  -mirror string
        使用鏡像站點下載鏡像
        這種方式不會修改 -image 指定的名稱
  -lab
        實驗室模式,開啟將使用默認參數來規避 DNS 污染和 SNI 阻斷,pull和list模式下都可以使用。
        一般情況下,默認設置是足夠的
  -dns-servers ip list
        實驗室模式開啟後,此選項生效。
        工具內置了列表,輸入內容將覆蓋內置列表。
        DNS伺服器配置選項,必須為解析後的 IP 地址,以逗號分割
  -dns-timeout int
         實驗室模式開啟後,此選項生效。 
         過濾DNS搶答的超時時間配置. (默認值 2s)
  -network network
        實驗室模式開啟後,此選項生效。
        ip4: 僅使用 IPv4 下載鏡像
        ip6: 僅使用 IPv6 下載鏡像
        ip: 使用 IPv4以及IPv6 下載鏡像 (默認值 "ip")

使用示例#

列出目標鏡像支持的架構#

查詢 nginx 支持的架構

docker-tar -action list -image nginx

輸出結果

Available Architecture:
amd64
armv5
armv7
arm64v8
386
mips64le
ppc64le
s390x

下載鏡像(直接下載)#

使用這種方式需要配置 HTTPS_PROXY 環境變量
下載 nginx armv7 架構的 nginx

docker-tar -action pull -image nginx -arch armv7 -output nginx.tar

輸出結果

Pulling from  nginx:latest
[1/7]3d83c6df5858: Downloading  100% |██████████████████████████████████████████████████| (24/24 MB, 1.9 MB/s)
[2/7]9260be83662e: Downloading  100% |██████████████████████████████████████████████████| (37/37 MB, 2.0 MB/s)
[3/7]3058d76256fc: Downloading  100% |██████████████████████████████████████████████████| (628/628 B, 986 kB/s)
[4/7]7888ef92f48d: Downloading  100% |██████████████████████████████████████████████████| (956/956 B, 994 kB/s)
[5/7]5c27d4148f08: Downloading  100% |██████████████████████████████████████████████████| (404/404 B, 400 kB/s)
[6/7]9c733a7e6553: Downloading  100% |█████████████████████████████████████████████████| (1.2/1.2 kB, 1.5 MB/s)
[7/7]931fb3c7333d: Downloading  100% |█████████████████████████████████████████████████| (1.4/1.4 kB, 2.5 MB/s)
Output File:  nginx.tar

下載鏡像(通過鏡像站點)#

下載 nginx armv7 架構的 nginx

docker-tar -action pull -image nginx -arch armv7 -output nginx.tar -mirror docker.xuanyuan.me

輸出結果

Pulling from  nginx:latest
[1/7]9c733a7e6553: Downloading  100% |█████████████████████████████████████████████████| (1.2/1.2 kB, 1.0 MB/s)
[2/7]931fb3c7333d: Downloading  100% |█████████████████████████████████████████████████| (1.4/1.4 kB, 2.8 MB/s)
[3/7]3d83c6df5858: Downloading  100% |███████████████████████████████████████████████████| (24/24 MB, 3.6 MB/s)
[4/7]9260be83662e: Downloading  100% |███████████████████████████████████████████████████| (37/37 MB, 5.2 MB/s)
[5/7]3058d76256fc: Downloading  100% |███████████████████████████████████████████████████| (628/628 B, 68 kB/s)
[6/7]7888ef92f48d: Downloading  100% |██████████████████████████████████████████████████| (956/956 B, 107 kB/s)
[7/7]5c27d4148f08: Downloading  100% |███████████████████████████████████████████████████| (404/404 B, 35 kB/s)
Output File:  nginx.tar

下載鏡像(使用實驗室模式直接下載)#

下載 nginx armv7 架構的 nginx

docker-tar -action pull -image nginx -arch armv7 -output nginx.tar -lab

輸出結果

Pulling from  nginx:latest
[1/7]3d83c6df5858: Downloading  100% |███████████████████████████████████████████████████| (24/24 MB, 6.9 MB/s)
[2/7]9260be83662e: Downloading  100% |████████████████████████████████████████████████████| (37/37 MB, 12 MB/s)
[3/7]3058d76256fc: Downloading  100% |██████████████████████████████████████████████████| (628/628 B, 489 kB/s)
[4/7]7888ef92f48d: Downloading  100% |██████████████████████████████████████████████████| (956/956 B, 671 kB/s)
[5/7]5c27d4148f08: Downloading  100% |██████████████████████████████████████████████████| (404/404 B, 353 kB/s)
[6/7]9c733a7e6553: Downloading  100% |█████████████████████████████████████████████████| (1.2/1.2 kB, 1.1 MB/s)
[7/7]931fb3c7333d: Downloading  100% |█████████████████████████████████████████████████| (1.4/1.4 kB, 2.8 MB/s)
Output File:  nginx.tar

TODO#

  • 多 Layer 並發下載
  • 分片下載支持,對支持 Range 的響應實現分片下載
  • Docker API 的兼容(ContentType)
  • 代碼結構、命名調整
  • 更友好的錯誤輸出

兼容情況(目前已測試)#

  • DockerHub
  • DockerHub 鏡像站
  • ghcr.io
  • ghcr.io 鏡像站
  • quay.io (目前未適配 application/vnd.docker.distribution.manifest.v1+prettyjws)
  • quay.io 鏡像站 (目前未適配 application/vnd.docker.distribution.manifest.v1+prettyjws)

一些可能有用的信息#

請求階段支持的 ContentType其他
獲取 Token只處理響應體,忽略類型Access Token, 用戶名密碼 (如需要): Basic
獲取所有架構鏡像清單索引application/vnd.oci.image.index.v1+json響應非此類型會直接終止
獲取指定架構的鏡像清單application/vnd.oci.image.manifest.v1+json兼容類型也可
獲取鏡像配置application/vnd.oci.image.config.v1+json兼容類型也可
下載 Layerapplication/vnd.oci.image.layer.v1.tar
application/vnd.oci.image.layer.v1.tar+gzip
application/vnd.oci.image.layer.v1.tar+zstd
application/vnd.oci.image.layer.nondistributable.v1.tar
application/vnd.oci.image.layer.nondistributable.v1.tar+gzip
application/vnd.oci.image.layer.nondistributable.v1.tar+zstd
application/vnd.docker.image.rootfs.diff.tar
application/vnd.docker.image.rootfs.diff.tar.gzip
application/vnd.docker.image.rootfs.diff.tar.zstd
加密鏡像不支持
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。