/
main.go
96 lines (74 loc) · 1.91 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package main
import (
"encoding/json"
"fmt"
"log"
"os"
"strings"
"github.com/asottile/dockerfile"
"github.com/spf13/cobra"
)
type Image struct {
Name string `json:"name"`
Tag string `json:"tag"`
}
func main() {
var unknownMarker string
var rootCmd = &cobra.Command{
Use: "dockerfile-image-tags",
Short: "List images & tags used in a Dockerfile.",
Args: cobra.MaximumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
file, err := getInput(args)
if err != nil {
log.Fatalf("Could not read Dockerfile: %s", err)
}
parsed, err := dockerfile.ParseReader(file)
if err != nil {
log.Fatalf("Could not parse Dockerfile: %s\n", err)
}
images := getTags(parsed, unknownMarker)
val, err := json.Marshal(images)
if err != nil {
log.Fatalf("Could not serialize images as JSON: %s\n", err)
}
fmt.Println(string(val))
},
}
rootCmd.Flags().StringVarP(&unknownMarker, "unknown-marker", "m", "?", "string to use to indicate unknown tags")
if err := rootCmd.Execute(); err != nil {
log.Fatal(err)
}
}
// getInput opens the file named in `args` if present, `os.Stdin` if not.
func getInput(args []string) (*os.File, error) {
if len(args) == 1 {
name := args[0]
f, err := os.Open(name)
if err != nil {
return nil, fmt.Errorf("could not open %s: %s", name, err)
}
return f, nil
}
return os.Stdin, nil
}
// getTags returns the `Image`s used in the given sets of Dockerfile commands.
func getTags(commands []dockerfile.Command, unknownMarker string) []Image {
images := []Image{}
for _, cmd := range commands {
if cmd.Cmd == "FROM" {
full := cmd.Value
rawImage := full[0]
imageParts := strings.Split(rawImage, ":")
image := imageParts[0]
var version string
if len(imageParts) > 1 {
version = imageParts[1]
} else {
version = unknownMarker
}
images = append(images, Image{Name: image, Tag: version})
}
}
return images
}