首先,将镜像从远程仓库提取并保存到指定的指定位置tar,然后load并导入docker daemon
package main import ( "flag" "fmt" "github.com/google/go-containerregistry/pkg/crane" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/daemon" "os" ) func main() { var ( srcName string dstName string ) flag.StringVar(&srcName, "src", "", "镜像名") flag.StringVar(&dstName, "dst", "", "镜像名") flag.Parse() DownloadImage(srcName, dstName) } func DownloadImage(srcName, dstName string) { var ( image v1.Image err error ) //1. Pull image from remote warehouse image, err = crane.Pull(srcName) if err != nil { fmt.Println("crane.Pull function failed, err :", err.Error()) return } //2. Gets the hash value of the image m, err := image.Manifest() imageFullHash := m.Config.Digest.Hex fmt.Println("image hash:", imageFullHash) //3. Create mirrored storage path Imagestoragedir := "tmp" // the default value is TMP directory err = os.MkdirAll(Imagestoragedir, 0755) if err != nil { fmt.Printf("mkdir %s failed!\n") return } imagePath := Imagestoragedir "/package.tar" err = crane.Save(image, "./data", imagePath) if err != nil { fmt.Println("crane.Save function failed") return } img2, err := crane.Load(imagePath) if err != nil { fmt.Println(" crane.Load function failed err:", err.Error()) return } tag3, _ := name.NewTag(dstName) str, err := daemon.Write(tag3, img2) if err != nil { fmt.Println("daemon.Write function failed") return } else { fmt.Println(str) } }
运行结果如下:
# ./crane -src 192.168.x.x:80/library/goharbor/registry-photon:v2.4.2 -dst registry-photon:test image hash: 62aedd01bd8520c43d06b09f7a0f67ba9720bdc04631a8242c65ea995f3ecac8 {"stream":"Loaded image: registry-photon:test\n"}