@@ -12,21 +12,41 @@ import (
12
12
"strings"
13
13
14
14
"github.com/docker/lunchbox/constants"
15
+ "github.com/docker/lunchbox/types"
15
16
"github.com/docker/lunchbox/utils"
16
17
"github.com/pkg/errors"
18
+ yaml "gopkg.in/yaml.v2"
17
19
)
18
20
19
21
func appName (appname string ) string {
20
22
return utils .AppNameFromDir (appname )
21
23
}
22
24
23
- // Save saves an app to docker
24
- func Save (appname , prefix , tag string ) error {
25
+ // Save saves an app to docker and returns the image name.
26
+ func Save (appname , prefix , tag string ) ( string , error ) {
25
27
appname , cleanup , err := Extract (appname )
26
28
if err != nil {
27
- return err
29
+ return "" , err
28
30
}
29
31
defer cleanup ()
32
+ if prefix == "" || tag == "" {
33
+ metaFile := filepath .Join (appname , "metadata.yml" )
34
+ metaContent , err := ioutil .ReadFile (metaFile )
35
+ if err != nil {
36
+ return "" , err
37
+ }
38
+ var meta types.AppMetadata
39
+ err = yaml .Unmarshal (metaContent , & meta )
40
+ if err != nil {
41
+ return "" , err
42
+ }
43
+ if tag == "" {
44
+ tag = meta .Version
45
+ }
46
+ if prefix == "" {
47
+ prefix = meta .RepositoryPrefix
48
+ }
49
+ }
30
50
dockerfile := `
31
51
FROM scratch
32
52
COPY / /
@@ -35,15 +55,16 @@ COPY / /
35
55
ioutil .WriteFile (df , []byte (dockerfile ), 0644 )
36
56
di := filepath .Join (appname , ".dockerignore" )
37
57
ioutil .WriteFile (di , []byte ("__Dockerfile-docker-app__\n .dockerignore" ), 0644 )
38
- args := []string {"build" , "-t" , prefix + appName (appname ) + constants .AppExtension + ":" + tag , "-f" , df , appname }
58
+ imageName := prefix + appName (appname ) + constants .AppExtension + ":" + tag
59
+ args := []string {"build" , "-t" , imageName , "-f" , df , appname }
39
60
cmd := exec .Command ("docker" , args ... )
40
61
output , err := cmd .CombinedOutput ()
41
62
os .Remove (df )
42
63
os .Remove (di )
43
64
if err != nil {
44
65
fmt .Println (string (output ))
45
66
}
46
- return err
67
+ return imageName , err
47
68
}
48
69
49
70
// Load loads an app from docker
@@ -89,11 +110,11 @@ func Push(appname, prefix, tag string) error {
89
110
return err
90
111
}
91
112
defer cleanup ()
92
- err = Save (appname , prefix , tag )
113
+ imageName , err : = Save (appname , prefix , tag )
93
114
if err != nil {
94
115
return err
95
116
}
96
- cmd := exec .Command ("docker" , "push" , prefix + appName ( appname ) + constants . AppExtension + ":" + tag )
117
+ cmd := exec .Command ("docker" , "push" , imageName )
97
118
output , err := cmd .CombinedOutput ()
98
119
if err != nil {
99
120
return errors .Wrapf (err , "error from docker push command: %s" , string (output ))
0 commit comments