Files
trivy/extractor/docker.go
2019-04-01 00:16:25 +09:00

52 lines
873 B
Go

package extractor
import (
"archive/tar"
"io"
"io/ioutil"
"path"
)
type DockerExtractor struct{}
func (d DockerExtractor) ExtractFiles(layer io.ReadCloser, filenames []string) (FilesMap, error) {
data := make(map[string][]byte)
tr := tar.NewReader(layer)
for {
hdr, err := tr.Next()
if err == io.EOF {
break
}
if err != nil {
return data, ErrCouldNotExtract
}
// Get element filename
filename := hdr.Name
filename = path.Clean(filename)
// Determine if we should extract the element
extract := false
for _, s := range filenames {
if s == filename {
extract = true
break
}
}
if !extract {
continue
}
// Extract the element
if hdr.Typeflag == tar.TypeSymlink || hdr.Typeflag == tar.TypeLink || hdr.Typeflag == tar.TypeReg {
d, _ := ioutil.ReadAll(tr)
data[filename] = d
}
}
return data, nil
}