/
raw_image_from_dockerfile.go
135 lines (110 loc) · 3.81 KB
/
raw_image_from_dockerfile.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package config
import (
"fmt"
"github.com/werf/werf/pkg/giterminism_manager"
)
type rawImageFromDockerfile struct {
Images []string `yaml:"-"`
Dockerfile string `yaml:"dockerfile,omitempty"`
Context string `yaml:"context,omitempty"`
ContextAddFile interface{} `yaml:"contextAddFile,omitempty"`
ContextAddFiles interface{} `yaml:"contextAddFiles,omitempty"`
Target string `yaml:"target,omitempty"`
Args map[string]interface{} `yaml:"args,omitempty"`
AddHost interface{} `yaml:"addHost,omitempty"`
Network string `yaml:"network,omitempty"`
SSH string `yaml:"ssh,omitempty"`
RawDependencies []*rawDependency `yaml:"dependencies,omitempty"`
doc *doc `yaml:"-"` // parent
UnsupportedAttributes map[string]interface{} `yaml:",inline"`
}
func (c *rawImageFromDockerfile) setAndValidateImage() error {
value, ok := c.UnsupportedAttributes["image"]
if ok {
delete(c.UnsupportedAttributes, "image")
switch t := value.(type) {
case []interface{}:
if images, err := InterfaceToStringArray(value, nil, c.doc); err != nil {
return err
} else {
c.Images = images
}
case string:
c.Images = []string{value.(string)}
case nil:
c.Images = []string{""}
default:
return newDetailedConfigError(fmt.Sprintf("invalid image name `%v`!", t), nil, c.doc)
}
}
return nil
}
func (c *rawImageFromDockerfile) UnmarshalYAML(unmarshal func(interface{}) error) error {
parentStack.Push(c)
type plain rawImageFromDockerfile
err := unmarshal((*plain)(c))
parentStack.Pop()
if err != nil {
return err
}
if err := c.setAndValidateImage(); err != nil {
return err
}
if err := checkOverflow(c.UnsupportedAttributes, nil, c.doc); err != nil {
return err
}
return nil
}
func (c *rawImageFromDockerfile) toImageFromDockerfileDirectives(giterminismManager giterminism_manager.Interface) (images []*ImageFromDockerfile, err error) {
for _, imageName := range c.Images {
if image, err := c.toImageFromDockerfileDirective(giterminismManager, imageName); err != nil {
return nil, err
} else {
images = append(images, image)
}
}
return images, nil
}
func (c *rawImageFromDockerfile) toImageFromDockerfileDirective(giterminismManager giterminism_manager.Interface, imageName string) (image *ImageFromDockerfile, err error) {
image = &ImageFromDockerfile{}
image.Name = imageName
image.Dockerfile = c.Dockerfile
image.Context = c.Context
contextAddFile, err := InterfaceToStringArray(c.ContextAddFile, nil, c.doc)
if err != nil {
return nil, err
}
contextAddFiles, err := InterfaceToStringArray(c.ContextAddFiles, nil, c.doc)
if err != nil {
return nil, err
}
switch {
case len(contextAddFile) > 0 && len(contextAddFiles) > 0:
return nil, newDetailedConfigError("only one out of contextAddFiles and contextAddFile directives can be used at a time, but both specified in werf.yaml. Move everything out of the contextAddFile: [] directive into the contextAddFiles: [] directive and remove contextAddFile: [] from werf.yaml", nil, c.doc)
case len(contextAddFile) > 0:
image.ContextAddFiles = contextAddFile
default:
image.ContextAddFiles = contextAddFiles
}
image.Target = c.Target
image.Args = c.Args
if addHost, err := InterfaceToStringArray(c.AddHost, c, c.doc); err != nil {
return nil, err
} else {
image.AddHost = addHost
}
image.Network = c.Network
image.SSH = c.SSH
for _, rawDep := range c.RawDependencies {
dependencyDirective, err := rawDep.toDirective()
if err != nil {
return nil, err
}
image.Dependencies = append(image.Dependencies, dependencyDirective)
}
image.raw = c
if err := image.validate(giterminismManager); err != nil {
return nil, err
}
return image, nil
}