7
7
"io/ioutil"
8
8
"os"
9
9
"path/filepath"
10
+ "text/template"
10
11
11
12
"github.com/docker/docker/pkg/archive"
12
13
enginetypes "github.com/docker/engine-api/types"
@@ -17,6 +18,47 @@ import (
17
18
"gopkg.in/yaml.v2"
18
19
)
19
20
21
+ const launcherScript = `#! /bin/sh
22
+ echo 32768 > /writable-proc/sys/net/core/somaxconn
23
+ echo 1 > /writable-proc/sys/vm/overcommit_memory
24
+ chmod 777 /dev/stdout
25
+ chmod 777 /dev/stderr
26
+
27
+ neednetwork=$1
28
+ if [ $neednetwork = "network" ]; then
29
+ # wait for macvlan
30
+ while ( ! ip addr show | grep 'UP' | grep 'vnbe'); do
31
+ echo -n o
32
+ sleep .5
33
+ done
34
+ fi
35
+
36
+ sleep 1
37
+
38
+ shift
39
+
40
+ {{.Command}}
41
+ `
42
+
43
+ const dockerFile = `FROM {{.Base}}
44
+ ENV ERU 1
45
+ ADD %s /{{.Appname}}
46
+ ADD launcher /usr/local/bin/launcher
47
+ ADD launcheroot /usr/local/bin/launcheroot
48
+ WORKDIR /{{.Appname}}
49
+ RUN useradd -u %s -d /nonexistent -s /sbin/nologin -U {{.Appname}}
50
+ {{with .Build}}
51
+ {{range $index, $value := .}}
52
+ RUN {{$value}}
53
+ {{end}}
54
+ {{end}}
55
+ `
56
+
57
+ // Entry is used to format templates
58
+ type entry struct {
59
+ Command string
60
+ }
61
+
20
62
// Get a random node from pod `podname`
21
63
func getRandomNode (c * Calcium , podname string ) (* types.Node , error ) {
22
64
nodes , err := c .ListPodNodes (podname )
@@ -36,7 +78,7 @@ func getRandomNode(c *Calcium, podname string) (*types.Node, error) {
36
78
return c .GetNode (podname , nodename )
37
79
}
38
80
39
- // build image for repository
81
+ // BuildImage will build image for repository
40
82
// since we wanna set UID for the user inside container, we have to know the uid parameter
41
83
//
42
84
// build directory is like:
@@ -179,38 +221,18 @@ func createTarStream(path string) (io.ReadCloser, error) {
179
221
}
180
222
181
223
// launcher scripts
182
- // TODO use golang template
183
224
func createLauncher (buildDir string , specs types.Specs ) error {
184
- entry := fmt .Sprintf ("exec sudo -E -u %s $@" , specs .Appname )
185
- entryRoot := "exec $@"
186
-
187
- tmpl := `#! /bin/sh
188
- echo 32768 > /writable-proc/sys/net/core/somaxconn
189
- echo 1 > /writable-proc/sys/vm/overcommit_memory
190
- chmod 777 /dev/stdout
191
- chmod 777 /dev/stderr
192
-
193
- neednetwork=$1
194
- if [ $neednetwork = "network" ]; then
195
- # wait for macvlan
196
- while ( ! ip addr show | grep 'UP' | grep 'vnbe'); do
197
- echo -n o
198
- sleep .5
199
- done
200
- fi
225
+ launcherScriptTemplate , _ := template .New ("launcher script" ).Parse (launcherScript )
201
226
202
- sleep 1
227
+ entryCommand := fmt .Sprintf ("exec sudo -E -u %s $@" , specs .Appname )
228
+ entryRootCommand := "exec $@"
203
229
204
- shift
205
-
206
- `
207
230
f , err := os .Create (filepath .Join (buildDir , "launcher" ))
208
231
if err != nil {
209
232
return err
210
233
}
211
234
defer f .Close ()
212
- f .WriteString (tmpl )
213
- f .WriteString (entry )
235
+ launcherScriptTemplate .Execute (f , entry {Command : entryCommand })
214
236
if err := f .Sync (); err != nil {
215
237
return err
216
238
}
@@ -223,8 +245,7 @@ shift
223
245
return err
224
246
}
225
247
defer fr .Close ()
226
- fr .WriteString (tmpl )
227
- fr .WriteString (entryRoot )
248
+ launcherScriptTemplate .Execute (fr , entry {Command : entryRootCommand })
228
249
if err := fr .Sync (); err != nil {
229
250
return err
230
251
}
@@ -243,16 +264,13 @@ func createDockerfile(buildDir, uid, reponame string, specs types.Specs) error {
243
264
}
244
265
defer f .Close ()
245
266
246
- f .WriteString (fmt .Sprintf ("FROM %s\n " , specs .Base ))
247
- f .WriteString ("ENV ERU 1\n " )
248
- f .WriteString (fmt .Sprintf ("ADD %s /%s\n " , reponame , specs .Appname ))
249
- f .WriteString ("ADD launcher /usr/local/bin/launcher\n " )
250
- f .WriteString ("ADD launcheroot /usr/local/bin/launcheroot\n " )
251
- f .WriteString (fmt .Sprintf ("WORKDIR /%s\n " , specs .Appname ))
252
- f .WriteString (fmt .Sprintf ("RUN useradd -u %s -d /nonexistent -s /sbin/nologin -U %s\n " , uid , specs .Appname ))
253
- for _ , cmd := range specs .Build {
254
- f .WriteString (fmt .Sprintf ("RUN %s\n " , cmd ))
267
+ dockerFileFormatted := fmt .Sprintf (dockerFile , reponame , uid )
268
+ t := template .New ("docker file template" )
269
+ parsedTemplate , err := t .Parse (dockerFileFormatted )
270
+ if err != nil {
271
+ return err
255
272
}
273
+ parsedTemplate .Execute (f , specs )
256
274
257
275
if err := f .Sync (); err != nil {
258
276
return err
0 commit comments