feat: proxy download image

This commit is contained in:
loveuer
2024-04-15 18:02:54 +08:00
parent c5d0b8e45b
commit 410a4c0d8d
57 changed files with 10913 additions and 316 deletions

127
x/t1/main.go Normal file
View File

@ -0,0 +1,127 @@
// https://iximiuz.com/en/posts/working-with-container-images-in-go/
// package main
//
// import (
//
// "context"
// "nf-repo/internal/util/tools"
// "os"
//
// "github.com/containers/image/copy"
// "github.com/containers/image/signature"
// "github.com/containers/image/storage"
// "github.com/containers/image/transports/alltransports"
// "github.com/containers/image/types"
//
// )
//
// func main() {
// imageName := "docker://alpine:latest"
// srcRef, _ := alltransports.ParseImageName(imageName)
//
// // Carries various default locations.
// systemCtx := &types.SystemContext{}
// policy, _ := signature.DefaultPolicy(systemCtx)
// policyCtx, _ := signature.NewPolicyContext(policy)
//
// dstName := imageName
// if srcRef.DockerReference() != nil {
// dstName = srcRef.DockerReference().String()
// }
// store := createStore() // see previous section
// dstRef, _ := storage.Transport.ParseStoreReference(store, dstName)
//
// copyOptions := &copy.Options{ReportWriter: os.Stdout}
// manifest, _ := copy.Image(
// context.Background(),
// policyCtx,
// dstRef,
// srcRef,
// copyOptions,
// )
// println(string(manifest))
// }
package main
import (
"encoding/json"
"github.com/containers/image/v5/pkg/blobinfocache"
"github.com/containers/image/v5/transports/alltransports"
"github.com/containers/image/v5/types"
digest "github.com/opencontainers/go-digest"
"log"
"nf-repo/internal/util/tools"
"runtime"
)
type M struct {
Manifests []struct {
Digest string `json:"digest"`
MediaType string `json:"mediaType"`
Platform struct {
Architecture string `json:"architecture"`
Os string `json:"os"`
Variant string `json:"variant,omitempty"`
} `json:"platform"`
Size int `json:"size"`
} `json:"manifests"`
MediaType string `json:"mediaType"`
SchemaVersion int `json:"schemaVersion"`
}
func main() {
imageName := "docker://alpine:latest"
srcRef, _ := alltransports.ParseImageName(imageName)
// Carries various default locations.
systemCtx := &types.SystemContext{
DockerInsecureSkipTLSVerify: types.OptionalBoolTrue,
DockerDisableV1Ping: true,
}
log.Printf("[NewImageSource] start!!!")
imgSrc, err := srcRef.NewImageSource(tools.Timeout(60), systemCtx)
if err != nil {
log.Panic(1, err)
}
log.Printf("[GetManifest] start!!!")
bs, str, err := imgSrc.GetManifest(tools.Timeout(5), nil)
if err != nil {
log.Panic(2, err)
}
log.Printf("[manifest] bs=%s str=%s", string(bs), str)
var (
m = new(M)
d string
)
if err = json.Unmarshal(bs, m); err != nil {
log.Panic(3, err)
}
for _, item := range m.Manifests {
if item.Platform.Os == "linux" && item.Platform.Architecture == runtime.GOARCH {
d = item.Digest
break
}
}
if d == "" {
log.Panicf("[4] empty digest: %s - %s", runtime.GOOS, runtime.GOARCH)
}
rc, size, err := imgSrc.GetBlob(tools.Timeout(60),
types.BlobInfo{
Digest: digest.Digest(d),
}, blobinfocache.DefaultCache(systemCtx))
if err != nil {
log.Panic(5, err)
}
log.Printf("[GetBlob] size=%d", size)
rc.Close()
}

61
x/t2/main.go Normal file
View File

@ -0,0 +1,61 @@
package main
import (
"context"
"github.com/google/go-containerregistry/pkg/name"
"github.com/google/go-containerregistry/pkg/v1/remote"
"io"
"log"
"os/signal"
"syscall"
)
func main() {
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
defer cancel()
puller, err := remote.NewPuller()
if err != nil {
log.Panic(1, err)
}
//imageName := "loveuer/hello:v2.0.1"
imageName := "alpine:latest"
tn, err := name.NewTag(imageName)
if err != nil {
log.Panic(2, err)
}
des, err := puller.Get(ctx, tn)
if err != nil {
log.Panic(3, err)
}
img, err := des.Image()
if err != nil {
log.Panic(4, err)
}
lys, err := img.Layers()
if err != nil {
log.Panic(5, err)
}
rs := make([]io.Reader, 0)
for _, item := range lys {
r, err := item.Uncompressed()
if err != nil {
log.Panic(6, err)
}
rs = append(rs, r)
}
allr := io.MultiReader(rs...)
bs, err := io.ReadAll(allr)
if err != nil {
log.Panic(7, err)
}
log.Printf("size: %.2f MB", float64(len(bs))/1024/1024)
}