@@ -3,7 +3,10 @@ package cmd
3
3
import (
4
4
"context"
5
5
"fmt"
6
+ "os"
7
+ "strings"
6
8
9
+ "github.com/codeskyblue/go-sh"
7
10
"github.com/docker/docker/api/types"
8
11
"github.com/docker/docker/client"
9
12
"github.com/spf13/cobra"
@@ -26,18 +29,33 @@ var dockerListCmd = &cobra.Command{
26
29
27
30
var dockerBuildCmd = & cobra.Command {
28
31
Use : "build" ,
29
- Short : "build a docker container"
30
- Long : "build a docker container for use with ingress-nginx"
31
- Run : func (cmd * cobra.Command , args []string ){
32
+
33
+ Long : "build a docker container for use with ingress-nginx" ,
34
+ Run : func (cmd * cobra.Command , args []string ) {
32
35
dockerBuild ()
33
36
},
34
-
35
37
}
38
+
39
+ var dco dockerBuildOpts
40
+
36
41
func init () {
37
42
rootCmd .AddCommand (dockerCmd )
38
43
dockerCmd .AddCommand (dockerListCmd )
44
+ dockerCmd .AddCommand (dockerBuildCmd )
45
+ dockerBuildCmd .Flags ().StringVar (& dco .PlatformFlag , "platformflag" , "" , "Setting the Docker --platform build flag" )
46
+ dockerBuildCmd .Flags ().StringSliceVar (& dco .Platform , "platforms" , PLATFORMS , "comma seperated list of platforms to build for container image" )
47
+ dockerBuildCmd .Flags ().StringVar (& dco .BuildArgs .BaseImage , "base" , "" , "base image to build container off of" )
48
+ dockerBuildCmd .Flags ().StringVar (& dco .Path , "path" , "" , "container build path" )
49
+ dockerBuildCmd .Flags ().StringVar (& dco .BuildArgs .Version , "version" , "" , "docker tag to build" )
50
+ dockerBuildCmd .Flags ().StringVar (& dco .BuildArgs .TargetArch , "targetarch" , "" , "target arch to build" )
51
+ dockerBuildCmd .Flags ().StringVar (& dco .BuildArgs .CommitSHA , "commitsha" , "" , "build arg commit sha to add to build" )
52
+ dockerBuildCmd .Flags ().StringVar (& dco .BuildArgs .BuildId , "build-id" , "" , "build id to add to container metadata" )
53
+ dockerBuildCmd .Flags ().StringVar (& dco .DockerFile , "dockerfile" , "" , "dockerfile of image to build" )
54
+ dockerBuildCmd .Flags ().StringVar (& dco .Image .Name , "name" , "" , "container image name registry/name:tag@digest" )
55
+ dockerBuildCmd .Flags ().StringVar (& dco .Image .Registry , "registry" , Registry , "Registry to tag image and push container registry/name:tag@digest" )
56
+ dockerBuildCmd .Flags ().StringVar (& dco .Image .Tag , "tag" , "" , "container tag registry/name:tag@digest" )
57
+ dockerBuildCmd .Flags ().StringVar (& dco .Image .Digest , "digest" , "" , "digest of container image registry/name:tag@digest" )
39
58
}
40
-
41
59
func dockerList () {
42
60
cli , err := client .NewClientWithOpts (client .FromEnv )
43
61
if err != nil {
@@ -54,35 +72,91 @@ func dockerList() {
54
72
}
55
73
}
56
74
75
+ var PLATFORMS = []string {"amd64" , "arm" , "arm64" , "s390x" }
76
+ var BUILDX_PLATFORMS = "linux/amd64,linux/arm,linux/arm64,linux/s390x"
77
+ var Registry = "gcr.io/k8s-staging-ingress-nginx"
78
+ var PKG = "k8s.io/ingress-nginx"
79
+
80
+ type dockerBuildOpts struct {
81
+ PlatformFlag string
82
+ Platform []string
83
+ BuildArgs BuildArgs
84
+ DockerFile string
85
+ Image Image
86
+ Path string
87
+ }
88
+
89
+ type BuildArgs struct {
90
+ BaseImage string
91
+ Version string
92
+ TargetArch string
93
+ CommitSHA string
94
+ BuildId string
95
+ }
96
+
97
+ // ControllerImage - struct with info about controllers
98
+ type Image struct {
99
+ Tag string
100
+ Digest string
101
+ Registry string
102
+ Name string
103
+ }
104
+
105
+ func (i Image ) print () string {
106
+ return fmt .Sprintf ("%s/%s:%s@sha256:%s" , i .Registry , i .Name , i .Tag , i .Digest )
107
+ }
108
+
57
109
func dockerBuild () error {
58
- /*
59
- docker build \
60
- ${PLATFORM_FLAG} ${PLATFORM} \
61
- --no-cache \
62
- --pull \
63
- --build-arg BASE_IMAGE="$(BASE_IMAGE)" \
64
- --build-arg VERSION="$(TAG)" \
65
- --build-arg TARGETARCH="$(ARCH)" \
66
- --build-arg COMMIT_SHA="$(COMMIT_SHA)" \
67
- --build-arg BUILD_ID="$(BUILD_ID)" \
68
- -t $(REGISTRY)/controller:$(TAG) rootfs
69
- */
70
-
71
- cli , err := client .NewClientWithOpts (client .FromEnv )
72
- if err != nil {
73
- panic (err )
74
- }
75
-
76
- builder := io.Reader {}
77
-
78
- options := docker.ImageCreateOptions {
79
-
80
-
81
- }
82
- buildReponse , err := cli .ImageBuild (context .Background (), builder , options )
83
- if err != nil {
84
- return err
85
- }
86
- return nil
87
-
88
- }
110
+ /*
111
+ docker build \
112
+ ${PLATFORM_FLAG} ${PLATFORM} \
113
+ --no-cache \
114
+ --pull \
115
+ --build-arg BASE_IMAGE="$(BASE_IMAGE)" \
116
+ --build-arg VERSION="$(TAG)" \
117
+ --build-arg TARGETARCH="$(ARCH)" \
118
+ --build-arg COMMIT_SHA="$(COMMIT_SHA)" \
119
+ --build-arg BUILD_ID="$(BUILD_ID)" \
120
+ -t $(REGISTRY)/controller:$(TAG) rootfs
121
+ */
122
+ session := sh .NewSession ()
123
+ session .ShowCMD = true
124
+
125
+ fmt .Printf ("Container Build Path: %v\n " , dco .Path )
126
+
127
+ buildArgs := BuildArgs (dco .BuildArgs )
128
+
129
+ fmt .Printf ("Base image: %s\n " , dco .BuildArgs .BaseImage )
130
+
131
+ fmt .Printf ("Build Args: %s\n " , buildArgs )
132
+
133
+ session .Command ("docker" , "build" , "--no-cache" , "--pull" , fmt .Sprintf ("%v" , buildArgs ), fmt .Sprintf ("%s" , dco .Path )).Run ()
134
+
135
+ return nil
136
+
137
+ }
138
+
139
+ func buildArgs (b * BuildArgs ) string {
140
+
141
+ if b .BaseImage == "" {
142
+ base , err := getIngressNginxBase ()
143
+ CheckIfError (err , "Issue Retrieving base image" )
144
+ fmt .Printf ("Base Image set %s\n " , base )
145
+ b .BaseImage = base
146
+ }
147
+
148
+ buildArgString := "--build-arg BASE_IMAGE=" + b .BaseImage
149
+
150
+ return buildArgString
151
+ }
152
+
153
+ func getIngressNginxBase () (string , error ) {
154
+ fmt .Print ("GET INGRESS NGINX BASE" )
155
+ dat , err := os .ReadFile ("../NGINX_BASE" )
156
+ CheckIfError (err , "Could not read NGINX_BASE file" )
157
+ fmt .Printf ("Get Ingress Dat: %v\n " , dat )
158
+ datString := string (dat )
159
+ //remove newline
160
+ datString = strings .Replace (datString , "\n " , "" , - 1 )
161
+ return datString , nil
162
+ }
0 commit comments