github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/image/docker.go (about) 1 package image 2 3 import ( 4 "bufio" 5 "compress/gzip" 6 "io" 7 "os" 8 9 v1 "github.com/google/go-containerregistry/pkg/v1" 10 "github.com/google/go-containerregistry/pkg/v1/tarball" 11 "golang.org/x/xerrors" 12 13 "github.com/devseccon/trivy/pkg/fanal/utils" 14 ) 15 16 func tryDockerArchive(fileName string) (v1.Image, error) { 17 img, err := tarball.Image(fileOpener(fileName), nil) 18 if err != nil { 19 return nil, xerrors.Errorf("unable to open %s as a Docker image: %w", fileName, err) 20 } 21 return img, nil 22 } 23 24 func fileOpener(fileName string) func() (io.ReadCloser, error) { 25 return func() (io.ReadCloser, error) { 26 f, err := os.Open(fileName) 27 if err != nil { 28 return nil, xerrors.Errorf("unable to open the file: %w", err) 29 } 30 31 var r io.Reader 32 br := bufio.NewReader(f) 33 r = br 34 35 if utils.IsGzip(br) { 36 r, err = gzip.NewReader(br) 37 if err != nil { 38 return nil, xerrors.Errorf("failed to open gzip: %w", err) 39 } 40 } 41 return io.NopCloser(r), nil 42 } 43 }