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  }