Skip to content

Commit b3679da

Browse files
author
tonic
committed
Merge branch 'master' into 'master'
rewrite launcher using template See merge request !2
2 parents dc96431 + 5f802e5 commit b3679da

File tree

1 file changed

+54
-36
lines changed

1 file changed

+54
-36
lines changed

cluster/calcium/build_image.go

+54-36
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"io/ioutil"
88
"os"
99
"path/filepath"
10+
"text/template"
1011

1112
"github.com/docker/docker/pkg/archive"
1213
enginetypes "github.com/docker/engine-api/types"
@@ -17,6 +18,47 @@ import (
1718
"gopkg.in/yaml.v2"
1819
)
1920

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+
2062
// Get a random node from pod `podname`
2163
func getRandomNode(c *Calcium, podname string) (*types.Node, error) {
2264
nodes, err := c.ListPodNodes(podname)
@@ -36,7 +78,7 @@ func getRandomNode(c *Calcium, podname string) (*types.Node, error) {
3678
return c.GetNode(podname, nodename)
3779
}
3880

39-
// build image for repository
81+
// BuildImage will build image for repository
4082
// since we wanna set UID for the user inside container, we have to know the uid parameter
4183
//
4284
// build directory is like:
@@ -179,38 +221,18 @@ func createTarStream(path string) (io.ReadCloser, error) {
179221
}
180222

181223
// launcher scripts
182-
// TODO use golang template
183224
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)
201226

202-
sleep 1
227+
entryCommand := fmt.Sprintf("exec sudo -E -u %s $@", specs.Appname)
228+
entryRootCommand := "exec $@"
203229

204-
shift
205-
206-
`
207230
f, err := os.Create(filepath.Join(buildDir, "launcher"))
208231
if err != nil {
209232
return err
210233
}
211234
defer f.Close()
212-
f.WriteString(tmpl)
213-
f.WriteString(entry)
235+
launcherScriptTemplate.Execute(f, entry{Command: entryCommand})
214236
if err := f.Sync(); err != nil {
215237
return err
216238
}
@@ -223,8 +245,7 @@ shift
223245
return err
224246
}
225247
defer fr.Close()
226-
fr.WriteString(tmpl)
227-
fr.WriteString(entryRoot)
248+
launcherScriptTemplate.Execute(fr, entry{Command: entryRootCommand})
228249
if err := fr.Sync(); err != nil {
229250
return err
230251
}
@@ -243,16 +264,13 @@ func createDockerfile(buildDir, uid, reponame string, specs types.Specs) error {
243264
}
244265
defer f.Close()
245266

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
255272
}
273+
parsedTemplate.Execute(f, specs)
256274

257275
if err := f.Sync(); err != nil {
258276
return err

0 commit comments

Comments
 (0)