Skip to content
This repository was archived by the owner on Mar 27, 2024. It is now read-only.

Switch from containers/image to go-containerregistry #229

Merged
merged 1 commit into from
May 14, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
92 changes: 19 additions & 73 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 2 additions & 10 deletions Gopkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,5 @@
version = "1.0.4"

[[constraint]]
name = "github.com/docker/distribution"
branch = "master"

[[constraint]]
name = "github.com/containers/image"
revision = "495da41bd26c50be62fa07ae903ea2ee54c00283"

[[constraint]]
branch = "master"
name = "github.com/mitchellh/go-homedir"
name = "github.com/google/go-containerregistry"
revision = "9a6a2b004c1a6d2c946acc52af194d85b882f8c6"
10 changes: 6 additions & 4 deletions cmd/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ go_library(
deps = [
"//cmd/util/output:go_default_library",
"//differs:go_default_library",
"//pkg/cache:go_default_library",
"//pkg/util:go_default_library",
"//util:go_default_library",
"//vendor/github.com/containers/image/docker:go_default_library",
"//vendor/github.com/docker/docker/client:go_default_library",
"//vendor/github.com/mitchellh/go-homedir:go_default_library",
"//vendor/github.com/google/go-containerregistry/authn:go_default_library",
"//vendor/github.com/google/go-containerregistry/name:go_default_library",
"//vendor/github.com/google/go-containerregistry/v1:go_default_library",
"//vendor/github.com/google/go-containerregistry/v1/daemon:go_default_library",
"//vendor/github.com/google/go-containerregistry/v1/remote:go_default_library",
"//vendor/github.com/google/go-containerregistry/v1/tarball:go_default_library",
"//vendor/github.com/sirupsen/logrus:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library",
"//vendor/github.com/spf13/pflag:go_default_library",
Expand Down
10 changes: 1 addition & 9 deletions cmd/analyze.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,19 +59,11 @@ func analyzeImage(imageName string, analyzerArgs []string) error {
return err
}

cli, err := pkgutil.NewClient()
if err != nil {
return fmt.Errorf("Error getting docker client: %s", err)
}
defer cli.Close()

prepper, err := getPrepperForImage(imageName)
image, err := getImageForName(imageName)
if err != nil {
return err
}

image, err := prepper.GetImage()

if !save {
defer pkgutil.CleanupImage(image)
}
Expand Down
13 changes: 1 addition & 12 deletions cmd/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,6 @@ func diffImages(image1Arg, image2Arg string, diffArgs []string) error {
return err
}

cli, err := pkgutil.NewClient()
if err != nil {
return err
}
defer cli.Close()
var wg sync.WaitGroup
wg.Add(2)

Expand All @@ -93,13 +88,7 @@ func diffImages(image1Arg, image2Arg string, diffArgs []string) error {
for imageArg := range imageMap {
go func(imageName string, imageMap map[string]*pkgutil.Image) {
defer wg.Done()

prepper, err := getPrepperForImage(imageName)
if err != nil {
logrus.Error(err)
return
}
image, err := prepper.GetImage()
image, err := getImageForName(imageName)
imageMap[imageName] = &image
if err != nil {
logrus.Warningf("Diff may be inaccurate: %s", err)
Expand Down
110 changes: 54 additions & 56 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,22 @@ package cmd
import (
goflag "flag"
"fmt"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"sort"
"strings"

"github.com/google/go-containerregistry/authn"
"github.com/google/go-containerregistry/name"
"github.com/google/go-containerregistry/v1/daemon"
"github.com/google/go-containerregistry/v1/remote"
"github.com/google/go-containerregistry/v1/tarball"

"github.com/GoogleContainerTools/container-diff/differs"
"github.com/GoogleContainerTools/container-diff/pkg/cache"
pkgutil "github.com/GoogleContainerTools/container-diff/pkg/util"
"github.com/GoogleContainerTools/container-diff/util"
"github.com/containers/image/docker"
"github.com/docker/docker/client"
homedir "github.com/mitchellh/go-homedir"
"github.com/google/go-containerregistry/v1"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
Expand All @@ -39,7 +43,6 @@ import (
var json bool
var save bool
var types diffTypes
var noCache bool

var LogLevel string
var format string
Expand Down Expand Up @@ -121,67 +124,63 @@ func checkIfValidAnalyzer(_ []string) error {
return nil
}

func getPrepperForImage(image string) (pkgutil.Prepper, error) {
cli, err := client.NewEnvClient()
if err != nil {
return nil, err
}

if pkgutil.IsTar(image) {
return &pkgutil.TarPrepper{
Source: filepath.Clean(image),
Client: cli,
}, nil
}

if strings.HasPrefix(image, DaemonPrefix) {
// remove the DaemonPrefix
image = strings.Replace(image, DaemonPrefix, "", -1)

return &pkgutil.DaemonPrepper{
Source: image,
Client: cli,
}, nil
func getImageForName(imageName string) (pkgutil.Image, error) {
logrus.Infof("getting image for name %s", imageName)
var img v1.Image
var err error
if pkgutil.IsTar(imageName) {
img, err = tarball.ImageFromPath(imageName, nil)
if err != nil {
return pkgutil.Image{}, err
}
}

// either has remote prefix or has no prefix, in which case we force remote
image = strings.Replace(image, RemotePrefix, "", -1)
ref, err := docker.ParseReference("//" + image)
if err != nil {
return nil, err
}
src, err := ref.NewImageSource(nil)
if err != nil {
return nil, err
}
defer src.Close()
if strings.HasPrefix(imageName, DaemonPrefix) {
// remove the daemon prefix
imageName = strings.Replace(imageName, DaemonPrefix, "", -1)

if !noCache {
cacheDir, err := cacheDir()
ref, err := name.ParseReference(imageName, name.WeakValidation)
if err != nil {
return nil, err
return pkgutil.Image{}, err
}

src, err = cache.NewFileCache(cacheDir, ref)
img, err = daemon.Image(ref, &daemon.ReadOptions{})
if err != nil {
return pkgutil.Image{}, err
}
} else {
// either has remote prefix or has no prefix, in which case we force remote
imageName = strings.Replace(imageName, RemotePrefix, "", -1)
ref, err := name.ParseReference(imageName, name.WeakValidation)
if err != nil {
return pkgutil.Image{}, err
}
auth, err := authn.DefaultKeychain.Resolve(ref.Context().Registry)
if err != nil {
return pkgutil.Image{}, err
}
img, err = remote.Image(ref, auth, http.DefaultTransport)
if err != nil {
return nil, err
return pkgutil.Image{}, err
}
}
// TODO(nkubala): implement caching

return &pkgutil.CloudPrepper{
Source: image,
Client: cli,
ImageSource: src,
}, nil
}

func cacheDir() (string, error) {
dir, err := homedir.Dir()
// create tempdir and extract fs into it
path, err := ioutil.TempDir("", strings.Replace(imageName, "/", "", -1))
if err != nil {
return "", err
return pkgutil.Image{}, err
}
if err := pkgutil.GetFileSystemForImage(img, path, nil); err != nil {
return pkgutil.Image{
FSPath: path,
}, err
}
rootDir := filepath.Join(dir, ".container-diff")
return filepath.Join(rootDir, "cache"), nil
return pkgutil.Image{
Image: img,
Source: imageName,
FSPath: path,
}, nil
}

func init() {
Expand Down Expand Up @@ -221,5 +220,4 @@ func addSharedFlags(cmd *cobra.Command) {
cmd.Flags().VarP(&types, "type", "t", "This flag sets the list of analyzer types to use. Set it repeatedly to use multiple analyzers.")
cmd.Flags().BoolVarP(&save, "save", "s", false, "Set this flag to save rather than remove the final image filesystems on exit.")
cmd.Flags().BoolVarP(&util.SortSize, "order", "o", false, "Set this flag to sort any file/package results by descending size. Otherwise, they will be sorted by name.")
cmd.Flags().BoolVarP(&noCache, "no-cache", "n", false, "Set this to force retrieval of layers on each run.")
}
Loading