diff --git a/Gmakefile b/Gmakefile new file mode 100644 index 0000000..9c5ef59 --- /dev/null +++ b/Gmakefile @@ -0,0 +1,39 @@ +env.linux { + GOOS: linux + GOARCH: amd64 +} + +client { + go build . +} + +linux(.linux) { + go build -o ./bin/${GOOS}_$GOARCH/ ./cmd/dget +} + +env.linux_arm { + GOOS: linux + GOARCH: arm +} + +linux_arm (.linux_arm){ + go build -o ./bin/${GOOS}_$GOARCH/ ./cmd/dget +} + +env.darwin { + GOOS: darwin + GOARCH: amd64 +} + +darwin (.darwin){ + go build -o ./bin/${GOOS}_$GOARCH/ ./cmd/dget +} + +env.windows { + GOOS: windows + GOARCH: amd64 +} + +windows (.windows){ + go build -o ./bin/${GOOS}_$GOARCH/ ./cmd/dget +} \ No newline at end of file diff --git a/README.md b/README.md index 649c42e..c52cf87 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,14 @@ dget influxdb:1.8.3 成功的话,会直接生成tar.gz包 +## 关于从第三方registry下载 + +``` +dget alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:220901.1 +``` + +形如上述调用方法,直接在包名称前面跟上服务器地址即可(v1.0.1) + ## 选择架构 最近很多的包都推出了多架构,命令增加了选择架构的功能 diff --git a/cmd/dget/main.go b/cmd/dget/main.go index 1337dc1..39f9741 100644 --- a/cmd/dget/main.go +++ b/cmd/dget/main.go @@ -13,6 +13,8 @@ func main() { debug := flag.Bool("debug", false, "打印调试信息") printInfo := flag.Bool("print", false, "只打印获取信息") arch := flag.String("arch", "linux/amd64", "指定架构") + var registry string + flag.StringVar(®istry, "registry", "registry-1.docker.io", "指定镜像仓库") flag.Parse() @@ -36,8 +38,13 @@ func main() { if !found { tag = "latest" } + partsOfPkg := strings.Split(pkg, "/") + if len(partsOfPkg) == 3 { + registry = partsOfPkg[0] + pkg = strings.Join(partsOfPkg[1:], "/") + } } - err := dget.Install(pkg, tag, *arch, *printInfo) + err := dget.Install(registry, pkg, tag, *arch, *printInfo) if err != nil { logrus.Fatalln("下载发生错误", err) } diff --git a/install.go b/install.go index 341ae70..0a0c1d5 100644 --- a/install.go +++ b/install.go @@ -22,7 +22,7 @@ import ( "github.com/sirupsen/logrus" ) -const _registry = "registry-1.docker.io" +// const _registry = "registry-1.docker.io" const _authUrl = "https://auth.docker.io/token" const _regService = "registry.docker.io" @@ -69,7 +69,7 @@ type PackageConfig struct { Layers []string } -func Install(d, tag string, arch string, printInfo bool) (err error) { +func Install(_registry, d, tag string, arch string, printInfo bool) (err error) { var authUrl = _authUrl var regService = _regService resp, err := http.Get(fmt.Sprintf("https://%s/v2/", _registry)) @@ -92,8 +92,9 @@ func Install(d, tag string, arch string, printInfo bool) (err error) { resp.Body.Close() var accessToken string logrus.Debugln("reg_service", regService) + logrus.Debugln("authUrl", authUrl) - accessToken, err = getAuthHead("application/vnd.docker.distribution.manifest.v2+json", authUrl, regService, d) + accessToken, err = getAuthHead(authUrl, regService, d) if err == nil { var req *http.Request @@ -337,14 +338,14 @@ response: return } -func getAuthHead(u, a, r, d string) (string, error) { +func getAuthHead(a, r, d string) (string, error) { resp, err := http.Get(fmt.Sprintf("%s?service=%s&scope=repository:%s:pull", a, r, d)) - defer resp.Body.Close() if err == nil { + defer resp.Body.Close() var results map[string]interface{} err = json.NewDecoder(resp.Body).Decode(&results) logrus.Debug(results) - if err == nil { + if err == nil && results["access_token"] != nil { return results["access_token"].(string), nil } }