kompose/pkg/utils/docker/image.go
2021-08-11 09:58:24 +08:00

59 lines
1.8 KiB
Go

package docker
import (
"path"
dockerparser "github.com/novln/docker-parser"
)
// Image contains the basic information parsed from full image name
// see github.com/novln/docker-parser Reference
type Image struct {
Name string // the image's name (ie: debian[:8.2])
ShortName string // the image's name (ie: debian)
Tag string // the image's tag (or digest)
Registry string // the image's registry. (ie: host[:port])
Repository string // the image's repository. (ie: registry/name)
Remote string // the image's remote identifier. (ie: registry/name[:tag])
}
func NewImageFromParsed(parsed *dockerparser.Reference) Image {
return Image{
Name: parsed.Name(),
ShortName: parsed.ShortName(),
Tag: parsed.Tag(),
Registry: parsed.Registry(),
Repository: parsed.Repository(),
Remote: parsed.Remote(),
}
}
// ParseImage Using https://github.com/novln/docker-parser in order to parse the appropriate name and registry.
// 1. Return default registry when the registry is not specified from image
// 2. Return target registry when the registry is specified from command line
func ParseImage(fullImageName string, targetRegistry string) (Image, error) {
var image Image
// First parse to fill default fields for image
// See github.com/novln/docker-parser/docker/reference.go
parsedImage, err := dockerparser.Parse(fullImageName)
if err != nil {
return image, err
}
// Registry from command argument is high priority than parsed from name of image.
if targetRegistry != "" {
// Parse again for validating registry
fullImageName = path.Join(targetRegistry, parsedImage.Name())
parsedImage, err = dockerparser.Parse(fullImageName)
if err != nil {
return image, err
}
}
image = NewImageFromParsed(parsedImage)
return image, nil
}