diff --git a/README.md b/README.md index 4e85f97..ef345da 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,11 @@ Analyze and image and get a pass/fail result based on the image efficiency and w **With Multiple Image Sources and Container Engines Supported** With the `--source` option, you can select where to fetch the container image from: ```bash -dive --source podman +dive --source +``` +or +```bash +dive :// ``` With valid `source` options as such: diff --git a/cmd/analyze.go b/cmd/analyze.go index 3c6f0ab..0a59442 100644 --- a/cmd/analyze.go +++ b/cmd/analyze.go @@ -39,16 +39,26 @@ func doAnalyzeCmd(cmd *cobra.Command, args []string) { os.Exit(1) } - engine, err := cmd.PersistentFlags().GetString("source") - if err != nil { - fmt.Printf("unable to determine engine: %v\n", err) - os.Exit(1) + var sourceType dive.ImageSource + var imageStr string + + sourceType, imageStr = dive.DeriveImageSource(userImage) + + if sourceType == dive.SourceUnknown { + sourceStr, err := cmd.PersistentFlags().GetString("source") + if err != nil { + fmt.Printf("unable to determine image source: %v\n", err) + os.Exit(1) + } + + sourceType = dive.ParseImageSource(sourceStr) + imageStr = userImage } runtime.Run(runtime.Options{ Ci: isCi, - Source: dive.ParseImageSource(engine), - Image: userImage, + Source: sourceType, + Image: imageStr, ExportFile: exportFile, CiConfig: ciConfig, }) diff --git a/dive/get_image_resolver.go b/dive/get_image_resolver.go index 3e9f9c6..fa79c16 100644 --- a/dive/get_image_resolver.go +++ b/dive/get_image_resolver.go @@ -5,6 +5,8 @@ import ( "github.com/wagoodman/dive/dive/image" "github.com/wagoodman/dive/dive/image/docker" "github.com/wagoodman/dive/dive/image/podman" + "net/url" + "strings" ) const ( @@ -24,11 +26,11 @@ func (r ImageSource) String() string { func ParseImageSource(r string) ImageSource { switch r { - case "docker": + case SourceDockerEngine.String(): return SourceDockerEngine - case "podman": + case SourcePodmanEngine.String(): return SourcePodmanEngine - case "docker-archive": + case SourceDockerArchive.String(): return SourceDockerArchive case "docker-tar": return SourceDockerArchive @@ -37,6 +39,28 @@ func ParseImageSource(r string) ImageSource { } } +func DeriveImageSource(image string) (ImageSource, string) { + u, err := url.Parse(image) + if err != nil { + return SourceUnknown, "" + } + + imageSource := strings.TrimPrefix(image, u.Scheme+"://") + + switch u.Scheme { + case SourceDockerEngine.String(): + return SourceDockerEngine, imageSource + case SourcePodmanEngine.String(): + return SourcePodmanEngine, imageSource + case SourceDockerArchive.String(): + return SourceDockerArchive, imageSource + case "docker-tar": + return SourceDockerArchive, imageSource + + } + return SourceUnknown, "" +} + func GetImageResolver(r ImageSource) (image.Resolver, error) { switch r { case SourceDockerEngine: