@@ -41,20 +41,23 @@ shift
41
41
{{.Command}}
42
42
`
43
43
44
- const dockerFile = `FROM {{.Base}}
44
+ const dockerFile = `ARG Base
45
+ ARG Appdir
46
+ ARG Appname
47
+ ARG BuildRun
48
+ ARG Reponame
49
+ ARG UID
50
+ FROM ${Base}
45
51
ENV ERU 1
46
- ADD %s {{. Appdir}}/{{. Appname} }
52
+ ADD ${Reponame} ${ Appdir}/${ Appname}
47
53
ADD launcher /usr/local/bin/launcher
48
54
ADD launcheroot /usr/local/bin/launcheroot
49
- WORKDIR {{.Appdir}}/{{.Appname}}
50
- RUN useradd -u %s -d /nonexistent -s /sbin/nologin -U {{.Appname}}
51
- RUN chown -R %s {{.Appdir}}/{{.Appname}}
52
- {{with .Build}}
53
- {{range $index, $value := .}}
54
- RUN {{$value}}
55
- {{end}}
56
- {{end}}
57
- `
55
+ WORKDIR ${Appdir}/${Appname}
56
+ RUN useradd -u ${UID} -d /nonexistent -s /sbin/nologin -U ${Appname}
57
+ RUN chown -R ${UID} ${Appdir}/${Appname}
58
+ RUN ${BuildRun}
59
+ USER ${Appname}
60
+ ` // USER之后的layer都会以user的身份去RUN command,所以这里一定要把USER放到最下面
58
61
59
62
// richSpecs is used to format templates
60
63
type richSpecs struct {
@@ -143,7 +146,7 @@ func (c *calcium) BuildImage(repository, version, uid, artifact string) (chan *t
143
146
}
144
147
145
148
// use app.yaml file to create Specs instance
146
- // which we'll need to create Dockerfile later
149
+ // which we'll need to generate build args later
147
150
bytes , err := ioutil .ReadFile (filepath .Join (cloneDir , "app.yaml" ))
148
151
if err != nil {
149
152
return ch , err
@@ -168,7 +171,7 @@ func (c *calcium) BuildImage(repository, version, uid, artifact string) (chan *t
168
171
if err := createLauncher (buildDir , rs ); err != nil {
169
172
return ch , err
170
173
}
171
- if err := createDockerfile (buildDir , reponame , rs ); err != nil {
174
+ if err := createDockerfile (buildDir ); err != nil {
172
175
return ch , err
173
176
}
174
177
@@ -181,6 +184,9 @@ func (c *calcium) BuildImage(repository, version, uid, artifact string) (chan *t
181
184
return ch , err
182
185
}
183
186
187
+ // generate build args
188
+ buildArgs := generateBuildArgs (reponame , specs , rs )
189
+
184
190
// must be put here because of that `defer os.RemoveAll(buildDir)`
185
191
buildOptions := enginetypes.ImageBuildOptions {
186
192
Tags : []string {tag },
@@ -189,6 +195,7 @@ func (c *calcium) BuildImage(repository, version, uid, artifact string) (chan *t
189
195
Remove : true ,
190
196
ForceRemove : true ,
191
197
PullParent : true ,
198
+ BuildArgs : buildArgs ,
192
199
}
193
200
log .Infof ("Building image %v with artifact %v at %v:%v" , tag , artifact , buildPodname , node .Name )
194
201
resp , err := node .Engine .ImageBuild (context .Background (), buildContext , buildOptions )
@@ -306,30 +313,32 @@ func createLauncher(buildDir string, rs richSpecs) error {
306
313
}
307
314
308
315
// Dockerfile
309
- func createDockerfile (buildDir , reponame string , rs richSpecs ) error {
316
+ func createDockerfile (buildDir string ) error {
310
317
f , err := os .Create (filepath .Join (buildDir , "Dockerfile" ))
311
318
if err != nil {
312
319
return err
313
320
}
314
321
defer f .Close ()
315
-
316
- dockerFileFormatted := fmt .Sprintf (dockerFile , reponame , rs .UID , rs .UID )
317
- t := template .New ("docker file template" )
318
- parsedTemplate , err := t .Parse (dockerFileFormatted )
319
- if err != nil {
320
- return err
321
- }
322
- err = parsedTemplate .Execute (f , rs )
323
- if err != nil {
324
- return err
325
- }
326
-
327
- if err := f .Sync (); err != nil {
322
+ if _ , err := f .WriteString (dockerFile ); err != nil {
328
323
return err
329
324
}
330
325
return nil
331
326
}
332
327
328
+ // generate build args
329
+ func generateBuildArgs (reponame string , specs types.Specs , rs richSpecs ) map [string ]* string {
330
+ buildArgs := map [string ]* string {}
331
+ buildArgs ["Base" ] = & (specs .Base )
332
+ buildArgs ["Appdir" ] = & (rs .Appdir )
333
+ buildArgs ["Appname" ] = & (rs .Appname )
334
+ runCommands := strings .Join (specs .Build , " && " )
335
+ buildArgs ["BuildRun" ] = & runCommands
336
+ buildArgs ["Reponame" ] = & reponame
337
+ buildArgs ["UID" ] = & rs .UID
338
+
339
+ return buildArgs
340
+ }
341
+
333
342
// Image tag
334
343
// 格式严格按照 Hub/HubPrefix/appname:version 来
335
344
func createImageTag (config types.Config , appname , version string ) string {
0 commit comments