import podman runtime approach
This commit is contained in:
parent
07af6d785b
commit
485f5fc500
@ -1,12 +1,14 @@
|
|||||||
package dive
|
package dive
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"github.com/wagoodman/dive/dive/image"
|
"github.com/wagoodman/dive/dive/image"
|
||||||
"github.com/wagoodman/dive/dive/image/docker"
|
"github.com/wagoodman/dive/dive/image/docker"
|
||||||
|
"net/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetAnalyzer(imageID string) image.Analyzer {
|
func GetAnalyzer(imageID string) image.Analyzer {
|
||||||
// u, _ := url.Parse(imageID)
|
u, _ := url.Parse(imageID)
|
||||||
// fmt.Printf("\n\nurl: %+v\n", u.Scheme)
|
fmt.Printf("\n\nurl: %+v\n", u.Scheme)
|
||||||
return docker.NewImageAnalyzer(imageID)
|
return docker.NewDockerImage(imageID)
|
||||||
}
|
}
|
@ -19,7 +19,7 @@ import (
|
|||||||
|
|
||||||
var dockerVersion string
|
var dockerVersion string
|
||||||
|
|
||||||
type imageAnalyzer struct {
|
type dockerImage struct {
|
||||||
id string
|
id string
|
||||||
client *client.Client
|
client *client.Client
|
||||||
jsonFiles map[string][]byte
|
jsonFiles map[string][]byte
|
||||||
@ -28,8 +28,8 @@ type imageAnalyzer struct {
|
|||||||
layers []*dockerLayer
|
layers []*dockerLayer
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewImageAnalyzer(imageId string) *imageAnalyzer {
|
func NewDockerImage(imageId string) *dockerImage {
|
||||||
return &imageAnalyzer{
|
return &dockerImage{
|
||||||
// store discovered json files in a map so we can read the image in one pass
|
// store discovered json files in a map so we can read the image in one pass
|
||||||
jsonFiles: make(map[string][]byte),
|
jsonFiles: make(map[string][]byte),
|
||||||
layerMap: make(map[string]*filetree.FileTree),
|
layerMap: make(map[string]*filetree.FileTree),
|
||||||
@ -37,7 +37,7 @@ func NewImageAnalyzer(imageId string) *imageAnalyzer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (img *imageAnalyzer) Fetch() (io.ReadCloser, error) {
|
func (img *dockerImage) Fetch() (io.ReadCloser, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
// pull the img if it does not exist
|
// pull the img if it does not exist
|
||||||
@ -79,14 +79,9 @@ func (img *imageAnalyzer) Fetch() (io.ReadCloser, error) {
|
|||||||
}
|
}
|
||||||
_, _, err = img.client.ImageInspectWithRaw(ctx, img.id)
|
_, _, err = img.client.ImageInspectWithRaw(ctx, img.id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
||||||
if !utils.IsDockerClientAvailable() {
|
|
||||||
return nil, fmt.Errorf("cannot find docker client executable")
|
|
||||||
}
|
|
||||||
|
|
||||||
// don't use the API, the CLI has more informative output
|
// don't use the API, the CLI has more informative output
|
||||||
fmt.Println("Image not available locally. Trying to pull '" + img.id + "'...")
|
fmt.Println("Image not available locally. Trying to pull '" + img.id + "'...")
|
||||||
err = utils.RunDockerCmd("pull", img.id)
|
err = runDockerCmd("pull", img.id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -100,7 +95,7 @@ func (img *imageAnalyzer) Fetch() (io.ReadCloser, error) {
|
|||||||
return readCloser, nil
|
return readCloser, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (img *imageAnalyzer) Parse(tarFile io.ReadCloser) error {
|
func (img *dockerImage) Parse(tarFile io.ReadCloser) error {
|
||||||
tarReader := tar.NewReader(tarFile)
|
tarReader := tar.NewReader(tarFile)
|
||||||
|
|
||||||
var currentLayer uint
|
var currentLayer uint
|
||||||
@ -144,7 +139,7 @@ func (img *imageAnalyzer) Parse(tarFile io.ReadCloser) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (img *imageAnalyzer) Analyze() (*image.AnalysisResult, error) {
|
func (img *dockerImage) Analyze() (*image.AnalysisResult, error) {
|
||||||
img.trees = make([]*filetree.FileTree, 0)
|
img.trees = make([]*filetree.FileTree, 0)
|
||||||
|
|
||||||
manifest := newDockerImageManifest(img.jsonFiles["manifest.json"])
|
manifest := newDockerImageManifest(img.jsonFiles["manifest.json"])
|
||||||
@ -223,7 +218,7 @@ func (img *imageAnalyzer) Analyze() (*image.AnalysisResult, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (img *imageAnalyzer) processLayerTar(name string, layerIdx uint, reader *tar.Reader) error {
|
func (img *dockerImage) processLayerTar(name string, layerIdx uint, reader *tar.Reader) error {
|
||||||
tree := filetree.NewFileTree()
|
tree := filetree.NewFileTree()
|
||||||
tree.Name = name
|
tree.Name = name
|
||||||
|
|
||||||
@ -245,7 +240,7 @@ func (img *imageAnalyzer) processLayerTar(name string, layerIdx uint, reader *ta
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (img *imageAnalyzer) getFileList(tarReader *tar.Reader) ([]filetree.FileInfo, error) {
|
func (img *dockerImage) getFileList(tarReader *tar.Reader) ([]filetree.FileInfo, error) {
|
||||||
var files []filetree.FileInfo
|
var files []filetree.FileInfo
|
||||||
|
|
||||||
for {
|
for {
|
@ -1,37 +0,0 @@
|
|||||||
package utils
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func IsDockerClientAvailable() bool {
|
|
||||||
_, err := exec.LookPath("docker")
|
|
||||||
return err == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RunDockerCmd runs a given Docker command in the current tty
|
|
||||||
func RunDockerCmd(cmdStr string, args ...string) error {
|
|
||||||
allArgs := cleanArgs(append([]string{cmdStr}, args...))
|
|
||||||
|
|
||||||
cmd := exec.Command("docker", allArgs...)
|
|
||||||
cmd.Env = os.Environ()
|
|
||||||
|
|
||||||
cmd.Stdout = os.Stdout
|
|
||||||
cmd.Stderr = os.Stderr
|
|
||||||
cmd.Stdin = os.Stdin
|
|
||||||
|
|
||||||
return cmd.Run()
|
|
||||||
}
|
|
||||||
|
|
||||||
// cleanArgs trims the whitespace from the given set of strings.
|
|
||||||
func cleanArgs(s []string) []string {
|
|
||||||
var r []string
|
|
||||||
for _, str := range s {
|
|
||||||
if str != "" {
|
|
||||||
r = append(r, strings.Trim(str, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user