侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 747 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录
Go

使用 Golang 下载阿里云 ACR 仓库中的 Chart

zze
zze
2022-02-21 / 0 评论 / 0 点赞 / 463 阅读 / 1698 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

最近在做 CD 自动化相关的开发,遇到一个需求需要从阿里云容器镜像服务(ACR)提供的 Helm Chart 仓库中下载已有的 Chart。

问题在于,阿里云提供了专有的 acr 协议来供镜像的拉取,而现有的开源的 go helm client 是不支持这个协议的,就这个问题我咨询了阿里云的相关人员,他们给我提供了如下代码:

package main

import (
	"fmt"
	cm "github.com/chartmuseum/helm-push/pkg/chartmuseum"
	"io/ioutil"
)

var (
	fileURL      = "https://xxx.cn-shenzhen.cr.aliyuncs.com/<namespace>/<repository>"
	username     = "xxx"
	password     = "xxx"
	chartname    = "xxx"
	chartversion = "0.1.0"
)

func main() {
	client, _ := cm.NewClient(
		cm.URL(fileURL),
		cm.Username(username),
		cm.Password(password),
		cm.AutoTokenAuth(true),
	)
	resp, err := client.DownloadFile("/charts/" + chartname + "-" + chartversion + ".tgz")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(resp)
	b, err := ioutil.ReadAll(resp.Body)
	defer resp.Body.Close()
	if err != nil {
		fmt.Println(err)
		return
	}
	if resp.StatusCode != 200 {
		fmt.Println(resp.StatusCode)
		return
	}
	ioutil.WriteFile(chartname+"-"+chartversion+".tgz", []byte(b), 0666)
}

该代码本身逻辑没问题,但是该代码库对应的 go mod 文件头定义是有错误的,并且由于太久没有更新,它引用的 docker 相关依赖已经失效,所以要在 go mod 文件中做一些 replace 操作,如下:

module testProject/learn_t/helm_client_t/t3

go 1.17

require github.com/chartmuseum/helm-push v0.10.2

require k8s.io/helm v2.16.1+incompatible // indirect

replace github.com/docker/docker => github.com/moby/moby v0.1.2

replace github.com/chartmuseum/helm-push => github.com/AliyunContainerService/helm-acr v0.8.2
0

评论区