Skip to content

Commit 2392ed0

Browse files
committed
Allow remote refs
1 parent 3a94703 commit 2392ed0

2 files changed

Lines changed: 60 additions & 11 deletions

File tree

README.md

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# layer
22

3-
Print info about container image tarballs.
3+
Print info about container images.
44

55
## Installation
66

@@ -10,17 +10,30 @@ go install github.com/stackb/layer@latest
1010

1111
## Usage
1212

13-
Show layers in an image:
13+
Show layers in an image (tarball filename):
1414

1515
```sh
16-
layer info myimage.tar
16+
$ layer info image.tar
17+
```
18+
19+
Show layers in an image (ref):
20+
21+
```
22+
$ layer info index.docker.io/nginx:latest
23+
N Layer Size
24+
1 sha256:9c1b6dd6c1e6be9fdd2b1987783824670d3b0dd7ae8ad6f57dc3cea5739ac71e 31 MB
25+
2 sha256:4b7fffa0f0a4a72b2f901c584c1d4ffb67cce7f033cc7969ee7713995c4d2610 25 MB
26+
3 sha256:f5ab86d69014270bcf4d5ce819b9f5c882b35527924ffdd11fecf0fc0dde81a4 604 B
27+
4 sha256:c876aa251c80272eb01eec011d50650e1b8af494149696b80a606bbeccf03d68 893 B
28+
5 sha256:7046505147d7f3edbf7c50c02e697d5450a2eebe5119b62b7362b10662899d85 667 B
29+
6 sha256:b6812e8d56d65d296e21a639b786e7e793e8b969bd2b109fd172646ce5ebe951 1.4 kB
1730
```
1831

1932
List files in an image:
2033

2134
```sh
22-
layer ls myimage.tar # all layers
23-
layer ls -S myimage.tar # sorted
24-
layer ls myimage.tar 1 # first layer
25-
layer ls myimage.tar sha256:8fdc131ec4308d2b9196a38855550dc347e83cc0f47d739754ddeb6e03ac2cbe # by diff ID
35+
layer ls image.tar # all layers
36+
layer ls -S image.tar # sorted
37+
layer ls image.tar 1 # first layer
38+
layer ls image.tar sha256:8fdc131ec4308d2b9196a38855550dc347e83cc0f47d739754ddeb6e03ac2cbe # by diff ID
2639
```

main.go

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ import (
1010
"text/tabwriter"
1111

1212
"github.com/dustin/go-humanize"
13+
"github.com/google/go-containerregistry/pkg/authn"
14+
"github.com/google/go-containerregistry/pkg/crane"
15+
"github.com/google/go-containerregistry/pkg/name"
1316
v1 "github.com/google/go-containerregistry/pkg/v1"
17+
"github.com/google/go-containerregistry/pkg/v1/remote"
1418
"github.com/google/go-containerregistry/pkg/v1/tarball"
1519
"github.com/urfave/cli/v2"
1620
)
@@ -68,17 +72,49 @@ func main() {
6872
app.Run(os.Args)
6973
}
7074

71-
func getImage(filename string) (v1.Image, error) {
72-
if filename == "" {
73-
return nil, fmt.Errorf("no filename provided")
75+
func getImage(r string) (v1.Image, error) {
76+
if r == "" {
77+
return nil, fmt.Errorf("no image ref provided")
7478
}
75-
image, err := tarball.ImageFromPath(filename, nil)
79+
80+
image, _, err := getRemoteImage(r)
81+
if err == nil {
82+
return image, nil
83+
}
84+
85+
image, err = tarball.ImageFromPath(r, nil)
7686
if err != nil {
7787
return nil, err
7888
}
89+
7990
return image, nil
8091
}
8192

93+
func makeOptions(opts ...crane.Option) crane.Options {
94+
opt := crane.Options{
95+
Remote: []remote.Option{
96+
remote.WithAuthFromKeychain(authn.DefaultKeychain),
97+
},
98+
}
99+
for _, o := range opts {
100+
o(&opt)
101+
}
102+
return opt
103+
}
104+
105+
func getRemoteImage(r string, opt ...crane.Option) (v1.Image, name.Reference, error) {
106+
o := makeOptions(opt...)
107+
ref, err := name.ParseReference(r, o.Name...)
108+
if err != nil {
109+
return nil, nil, fmt.Errorf("parsing reference %q: %w", r, err)
110+
}
111+
img, err := remote.Image(ref, o.Remote...)
112+
if err != nil {
113+
return nil, nil, fmt.Errorf("reading image %q: %w", ref, err)
114+
}
115+
return img, ref, nil
116+
}
117+
82118
// info returns the config file for the given filename.
83119
func info(cfg *config) error {
84120
image, err := getImage(cfg.filename)

0 commit comments

Comments
 (0)