import podman runtime approach

This commit is contained in:
Alex Goodman 2019-10-02 14:25:19 -04:00
parent 07af6d785b
commit 485f5fc500
No known key found for this signature in database
GPG key ID: 98AF011C5C78EB7E
3 changed files with 14 additions and 54 deletions

View file

@ -1,12 +1,14 @@
package dive
import (
"fmt"
"github.com/wagoodman/dive/dive/image"
"github.com/wagoodman/dive/dive/image/docker"
"net/url"
)
func GetAnalyzer(imageID string) image.Analyzer {
// u, _ := url.Parse(imageID)
// fmt.Printf("\n\nurl: %+v\n", u.Scheme)
return docker.NewImageAnalyzer(imageID)
u, _ := url.Parse(imageID)
fmt.Printf("\n\nurl: %+v\n", u.Scheme)
return docker.NewDockerImage(imageID)
}

View file

@ -19,7 +19,7 @@ import (
var dockerVersion string
type imageAnalyzer struct {
type dockerImage struct {
id string
client *client.Client
jsonFiles map[string][]byte
@ -28,8 +28,8 @@ type imageAnalyzer struct {
layers []*dockerLayer
}
func NewImageAnalyzer(imageId string) *imageAnalyzer {
return &imageAnalyzer{
func NewDockerImage(imageId string) *dockerImage {
return &dockerImage{
// store discovered json files in a map so we can read the image in one pass
jsonFiles: make(map[string][]byte),
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
// 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)
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
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 {
return nil, err
}
@ -100,7 +95,7 @@ func (img *imageAnalyzer) Fetch() (io.ReadCloser, error) {
return readCloser, nil
}
func (img *imageAnalyzer) Parse(tarFile io.ReadCloser) error {
func (img *dockerImage) Parse(tarFile io.ReadCloser) error {
tarReader := tar.NewReader(tarFile)
var currentLayer uint
@ -144,7 +139,7 @@ func (img *imageAnalyzer) Parse(tarFile io.ReadCloser) error {
return nil
}
func (img *imageAnalyzer) Analyze() (*image.AnalysisResult, error) {
func (img *dockerImage) Analyze() (*image.AnalysisResult, error) {
img.trees = make([]*filetree.FileTree, 0)
manifest := newDockerImageManifest(img.jsonFiles["manifest.json"])
@ -223,7 +218,7 @@ func (img *imageAnalyzer) Analyze() (*image.AnalysisResult, error) {
}, 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.Name = name
@ -245,7 +240,7 @@ func (img *imageAnalyzer) processLayerTar(name string, layerIdx uint, reader *ta
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
for {

View file

@ -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
}