/
dockerfile_image_builder.go
97 lines (75 loc) · 2.68 KB
/
dockerfile_image_builder.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
package container_runtime
import (
"context"
"fmt"
"os"
)
type DockerfileImageBuilder struct {
ContainerRuntime ContainerRuntime
Dockerfile []byte
BuildDockerfileOptions BuildDockerfileOpts
ContextArchivePath string
builtID string
}
func NewDockerfileImageBuilder(containerRuntime ContainerRuntime) *DockerfileImageBuilder {
return &DockerfileImageBuilder{ContainerRuntime: containerRuntime}
}
// filePathToStdin != "" ??
func (b *DockerfileImageBuilder) Build(ctx context.Context) error {
if debug() {
fmt.Printf("[DOCKER BUILD] context archive path: %s\n", b.ContextArchivePath)
}
contextReader, err := os.Open(b.ContextArchivePath)
if err != nil {
return fmt.Errorf("unable to open context archive %q: %s", b.ContextArchivePath, err)
}
defer contextReader.Close()
opts := b.BuildDockerfileOptions
opts.ContextTar = contextReader
if debug() {
fmt.Printf("ContextArchivePath=%q\n", b.ContextArchivePath)
fmt.Printf("BiuldDockerfileOptions: %#v\n", opts)
}
builtID, err := b.ContainerRuntime.BuildDockerfile(ctx, b.Dockerfile, opts)
if err != nil {
return fmt.Errorf("error building dockerfile with %s: %s", b.ContainerRuntime.String(), err)
}
b.builtID = builtID
return nil
}
func (b *DockerfileImageBuilder) Cleanup(ctx context.Context) error {
if err := b.ContainerRuntime.Rmi(ctx, b.builtID, RmiOpts{}); err != nil {
return fmt.Errorf("unable to remove built dockerfile image %q: %s", b.builtID, err)
}
return nil
}
func (b *DockerfileImageBuilder) GetBuiltId() string {
return b.builtID
}
func (b *DockerfileImageBuilder) SetDockerfile(dockerfile []byte) {
b.Dockerfile = dockerfile
}
func (b *DockerfileImageBuilder) SetDockerfileCtxRelPath(dockerfileCtxRelPath string) {
b.BuildDockerfileOptions.DockerfileCtxRelPath = dockerfileCtxRelPath
}
func (b *DockerfileImageBuilder) SetTarget(target string) {
b.BuildDockerfileOptions.Target = target
}
func (b *DockerfileImageBuilder) AppendBuildArgs(args ...string) {
b.BuildDockerfileOptions.BuildArgs = append(b.BuildDockerfileOptions.BuildArgs, args...)
}
func (b *DockerfileImageBuilder) AppendAddHost(addHost ...string) {
b.BuildDockerfileOptions.AddHost = append(b.BuildDockerfileOptions.AddHost, addHost...)
}
func (b *DockerfileImageBuilder) SetNetwork(network string) {
b.BuildDockerfileOptions.Network = network
}
func (b *DockerfileImageBuilder) SetSSH(ssh string) {
b.BuildDockerfileOptions.SSH = ssh
}
func (b *DockerfileImageBuilder) AppendLabels(labels ...string) {
b.BuildDockerfileOptions.Labels = append(b.BuildDockerfileOptions.Labels, labels...)
}
func (b *DockerfileImageBuilder) SetContextArchivePath(contextArchivePath string) {
b.ContextArchivePath = contextArchivePath
}