@@ -14,30 +14,25 @@ import (
1414 "github.com/google/go-containerregistry/pkg/crane"
1515 "github.com/google/go-containerregistry/pkg/name"
1616 v1 "github.com/google/go-containerregistry/pkg/v1"
17+ "github.com/google/go-containerregistry/pkg/v1/daemon"
1718 "github.com/google/go-containerregistry/pkg/v1/remote"
1819 "github.com/google/go-containerregistry/pkg/v1/tarball"
1920 "github.com/urfave/cli/v2"
2021)
2122
22- type config struct {
23- filename string
24- layerIDs []string
25- sort bool
26- }
27-
2823func main () {
2924 app := & cli.App {
3025 Name : "layer" ,
3126 Usage : "inspect layers of an image" ,
3227 Commands : []* cli.Command {
3328 {
34- Name : "info " ,
35- Usage : "info prints info about the layers of an image" ,
29+ Name : "inspect " ,
30+ Usage : "print info about the layers of an image" ,
3631 Action : func (c * cli.Context ) error {
3732 cfg := & config {
38- filename : c .Args ().First (),
33+ ref : c .Args ().First (),
3934 }
40- if err := info (cfg ); err != nil {
35+ if err := inspect (cfg ); err != nil {
4136 return cli .Exit (c .Command .Name + ": " + err .Error (), 1 )
4237 }
4338 return nil
@@ -48,12 +43,12 @@ func main() {
4843 Usage : "ls prints the files of a layer" ,
4944 Action : func (c * cli.Context ) error {
5045 cfg := & config {
51- filename : c .Args ().First (),
46+ ref : c .Args ().First (),
5247 layerIDs : c .Args ().Tail (),
5348 sort : c .Bool ("sort" ),
5449 }
5550
56- if err := files (cfg ); err != nil {
51+ if err := ls (cfg ); err != nil {
5752 return cli .Exit (c .Command .Name + ": " + err .Error (), 1 )
5853 }
5954 return nil
@@ -72,52 +67,84 @@ func main() {
7267 app .Run (os .Args )
7368}
7469
70+ // config is the configuration for the layer commands.
71+ type config struct {
72+ // ref is the image ref to inspect, or a path to a tarball.
73+ ref string
74+ // layerIDs is the list of layer IDs to inspect.
75+ layerIDs []string
76+ // sort is true if the output should be sorted by size.
77+ sort bool
78+ }
79+
80+ // makeOptions returns the options for crane.
81+ func makeOptions (opts ... crane.Option ) crane.Options {
82+ opt := crane.Options {
83+ Remote : []remote.Option {
84+ remote .WithAuthFromKeychain (authn .DefaultKeychain ),
85+ },
86+ }
87+ for _ , o := range opts {
88+ o (& opt )
89+ }
90+ return opt
91+ }
92+
93+ // getImage returns the image for the given ref.
7594func getImage (r string ) (v1.Image , error ) {
7695 if r == "" {
7796 return nil , fmt .Errorf ("no image ref provided" )
7897 }
7998
80- image , _ , err := getRemoteImage ( r )
99+ image , err := tarball . ImageFromPath ( r , nil )
81100 if err == nil {
82101 return image , nil
83102 }
84103
85- image , err = tarball . ImageFromPath ( r , nil )
86- if err ! = nil {
87- return nil , err
104+ image , _ , err = getDaemonImage ( r )
105+ if err = = nil {
106+ return image , nil
88107 }
89108
90- return image , nil
109+ image , _ , err = getRemoteImage (r )
110+ if err == nil {
111+ return image , nil
112+ }
113+
114+ return nil , fmt .Errorf ("unable to find image %q" , r )
91115}
92116
93- func makeOptions (opts ... crane.Option ) crane.Options {
94- opt := crane.Options {
95- Remote : []remote.Option {
96- remote .WithAuthFromKeychain (authn .DefaultKeychain ),
97- },
117+ // getRemoteImage returns the image for the given ref.
118+ func getRemoteImage (r string , opt ... crane.Option ) (v1.Image , name.Reference , error ) {
119+ o := makeOptions (opt ... )
120+ ref , err := name .ParseReference (r , o .Name ... )
121+ if err != nil {
122+ return nil , nil , fmt .Errorf ("parsing reference %q: %w" , r , err )
98123 }
99- for _ , o := range opts {
100- o (& opt )
124+ img , err := remote .Image (ref , o .Remote ... )
125+ if err != nil {
126+ return nil , nil , fmt .Errorf ("reading image %q: %w" , ref , err )
101127 }
102- return opt
128+ return img , ref , nil
103129}
104130
105- func getRemoteImage (r string , opt ... crane.Option ) (v1.Image , name.Reference , error ) {
131+ // getDaemonImage returns the image for the given ref.
132+ func getDaemonImage (r string , opt ... crane.Option ) (v1.Image , name.Reference , error ) {
106133 o := makeOptions (opt ... )
107134 ref , err := name .ParseReference (r , o .Name ... )
108135 if err != nil {
109136 return nil , nil , fmt .Errorf ("parsing reference %q: %w" , r , err )
110137 }
111- img , err := remote .Image (ref , o . Remote ... )
138+ img , err := daemon .Image (ref )
112139 if err != nil {
113140 return nil , nil , fmt .Errorf ("reading image %q: %w" , ref , err )
114141 }
115142 return img , ref , nil
116143}
117144
118- // info returns the config file for the given filename .
119- func info (cfg * config ) error {
120- image , err := getImage (cfg .filename )
145+ // inspect prints info about layers .
146+ func inspect (cfg * config ) error {
147+ image , err := getImage (cfg .ref )
121148 if err != nil {
122149 return err
123150 }
@@ -145,9 +172,9 @@ func info(cfg *config) error {
145172 return tw .Flush ()
146173}
147174
148- func files ( cfg * config ) error {
149-
150- image , err := getImage (cfg .filename )
175+ // ls prints layers.
176+ func ls ( cfg * config ) error {
177+ image , err := getImage (cfg .ref )
151178 if err != nil {
152179 return err
153180 }
@@ -159,7 +186,7 @@ func files(cfg *config) error {
159186
160187 if len (cfg .layerIDs ) == 0 {
161188 for _ , layer := range layers {
162- if err := layerFiles (cfg , layer ); err != nil {
189+ if err := files (cfg , layer ); err != nil {
163190 return err
164191 }
165192 }
@@ -171,7 +198,7 @@ func files(cfg *config) error {
171198 if n < 1 || n > len (layers ) {
172199 return fmt .Errorf ("layer %d does not exist" , n )
173200 }
174- if err := layerFiles (cfg , layers [n - 1 ]); err != nil {
201+ if err := files (cfg , layers [n - 1 ]); err != nil {
175202 return err
176203 }
177204 continue
@@ -187,15 +214,16 @@ func files(cfg *config) error {
187214 if err != nil {
188215 return fmt .Errorf ("layer %s not found: %w" , id , err )
189216 }
190- if err := layerFiles (cfg , layer ); err != nil {
217+ if err := files (cfg , layer ); err != nil {
191218 return err
192219 }
193220 }
194221
195222 return nil
196223}
197224
198- func layerFiles (cfg * config , layer v1.Layer ) error {
225+ // files lists the files in the given layer.
226+ func files (cfg * config , layer v1.Layer ) error {
199227 hash , err := layer .DiffID ()
200228 if err != nil {
201229 return fmt .Errorf ("getting layer diffid: %w" , err )
0 commit comments