diff --git a/bin/darwin_amd64/dget b/bin/darwin_amd64/dget index 79688ed..c76cf2d 100644 Binary files a/bin/darwin_amd64/dget and b/bin/darwin_amd64/dget differ diff --git a/bin/darwin_arm64/dget b/bin/darwin_arm64/dget index 22db43b..b07ac73 100644 Binary files a/bin/darwin_arm64/dget and b/bin/darwin_arm64/dget differ diff --git a/bin/linux_amd64/dget b/bin/linux_amd64/dget index f390f8b..06d4964 100644 Binary files a/bin/linux_amd64/dget and b/bin/linux_amd64/dget differ diff --git a/bin/linux_arm/dget b/bin/linux_arm/dget index 4970929..90008a6 100644 Binary files a/bin/linux_arm/dget and b/bin/linux_arm/dget differ diff --git a/bin/windows_amd64/dget.exe b/bin/windows_amd64/dget.exe index 77529fc..7ae2230 100644 Binary files a/bin/windows_amd64/dget.exe and b/bin/windows_amd64/dget.exe differ diff --git a/cmd/dget/main.go b/cmd/dget/main.go index 4fd773b..94f0365 100644 --- a/cmd/dget/main.go +++ b/cmd/dget/main.go @@ -19,6 +19,7 @@ func main() { username := flag.String("username", "", "username") password := flag.String("password", "", "password") tags := flag.Bool("tags", false, "获取tag列表") + syncCount := flag.Int("sync", 3, "并发下载数量") var registry string flag.StringVar(®istry, "registry", "registry-1.docker.io", "指定镜像仓库") @@ -67,7 +68,7 @@ func main() { client.SetClient(http.DefaultClient) } - var err = client.Install(registry, pkg, tag, *arch, *printInfo, *tags, *username, *password) + var err = client.Install(*syncCount, registry, pkg, tag, *arch, *printInfo, *tags, *username, *password) if err != nil { logrus.Fatalln("下载发生错误", err) } diff --git a/install.go b/install.go index 03b6b28..52c8f41 100644 --- a/install.go +++ b/install.go @@ -79,11 +79,13 @@ type TagList struct { Tags []string } +type SyncSignal struct{} + func (m *Client) SetClient(c *http.Client) { m.c = c } -func (m *Client) Install(_registry, d, tag string, arch string, printInfo bool, onlyGetTag bool, username string, password string) (err error) { +func (m *Client) Install(syncCount int, _registry, d, tag string, arch string, printInfo bool, onlyGetTag bool, username string, password string) (err error) { var authUrl = _authUrl var regService = _regService resp, err := m.c.Get(fmt.Sprintf("https://%s/v2/", _registry)) @@ -232,7 +234,7 @@ func (m *Client) Install(_registry, d, tag string, arch string, printInfo bool, resp.Body.Close() logrus.Infof("获得Manifest信息,共%d层需要下载", len(info.Layers)) - err = m.download(_registry, d, tag, info.Config.Digest, authHeader, info.Layers) + err = m.download(syncCount, _registry, d, tag, info.Config.Digest, authHeader, info.Layers) if err != nil { goto response @@ -273,7 +275,7 @@ func (m *Client) getTokenWithBasicAuth(url, service, repository, username, passw return "", err } -func (m *Client) download(_registry, d, tag string, digest digest.Digest, authHeader http.Header, layers []Layer) (err error) { +func (m *Client) download(syncCount int, _registry, d, tag string, digest digest.Digest, authHeader http.Header, layers []Layer) (err error) { var tmpDir = fmt.Sprintf("tmp_%s_%s", d, tag) err = os.MkdirAll(tmpDir, 0777) if err == nil { @@ -308,9 +310,9 @@ func (m *Client) download(_registry, d, tag string, digest digest.Digest, authHe parentid := "" var fakeLayerId string var downloadStatus = make(map[int]bool) - var notifyChan = make(chan int, 3) + var notifyChan = make(chan int, 1) //限制并发下载数为3 - var ch = make(chan struct{}, 3) + var ch = make(chan SyncSignal, syncCount) for n, layer := range layers { namer := sha256.New() namer.Write([]byte(parentid + "\n" + layer.Digest + "\n")) @@ -332,7 +334,7 @@ func (m *Client) download(_registry, d, tag string, digest digest.Digest, authHe copyedHeader[k] = v } go func(fakeLayerId string, layer Layer, n int, notifyChan chan int, layerInfo *LayerInfo, tmpDir string, _registry string, d string, authHeader http.Header) { - ch <- struct{}{} + ch <- SyncSignal{} er := m.downloadLayer(fakeLayerId, &layer, layerInfo, tmpDir, _registry, d, authHeader) if er != nil { logrus.Errorf("下载第%d/%d层失败:%s", n+1, len(layers), err)