@@ -35,29 +35,45 @@ func Save(app *types.App, namespace, tag string) (string, error) {
3535 if namespace != "" && ! strings .HasSuffix (namespace , "/" ) {
3636 namespace += "/"
3737 }
38+ dir , err := prepareDockerBuildDirectory (app , meta )
39+ if err != nil {
40+ return "" , err
41+ }
42+ defer os .RemoveAll (dir )
43+ imageName := namespace + internal .AppNameFromDir (app .Name ) + internal .AppExtension + ":" + tag
44+ args := []string {"build" , "-t" , imageName , dir }
45+ cmd := exec .Command ("docker" , args ... )
46+ cmd .Stdout = ioutil .Discard
47+ cmd .Stderr = os .Stderr
48+ err = cmd .Run ()
49+ return imageName , err
50+ }
51+
52+ func prepareDockerBuildDirectory (app * types.App , meta metadata.AppMetadata ) (string , error ) {
3853 dockerfile := fmt .Sprintf (`
3954FROM scratch
4055LABEL %s=%s
4156LABEL maintainers="%v"
4257COPY / /
4358` , internal .ImageLabel , meta .Name , meta .Maintainers )
44- df := filepath .Join (app .Path , "__Dockerfile-docker-app__" )
59+ dir , err := ioutil .TempDir ("" , "app-save" )
60+ if err != nil {
61+ return "" , errors .Wrap (err , "cannot create temporary directory" )
62+ }
63+ // Write dockerfile
64+ df := filepath .Join (dir , "Dockerfile" )
4565 if err := ioutil .WriteFile (df , []byte (dockerfile ), 0644 ); err != nil {
46- return "" , errors .Wrapf (err , "cannot create file %s" , df )
66+ return dir , errors .Wrapf (err , "cannot create file %s" , df )
4767 }
48- defer os .Remove (df )
49- di := filepath .Join (app .Path , ".dockerignore" )
50- if err := ioutil .WriteFile (di , []byte ("__Dockerfile-docker-app__\n .dockerignore" ), 0644 ); err != nil {
51- return "" , errors .Wrapf (err , "cannot create file %s" , di )
68+ di := filepath .Join (dir , ".dockerignore" )
69+ if err := ioutil .WriteFile (di , []byte ("Dockerfile\n .dockerignore" ), 0644 ); err != nil {
70+ return dir , errors .Wrapf (err , "cannot create file %s" , di )
5271 }
53- defer os .Remove (di )
54- imageName := namespace + internal .AppNameFromDir (app .Name ) + internal .AppExtension + ":" + tag
55- args := []string {"build" , "-t" , imageName , "-f" , df , app .Path }
56- cmd := exec .Command ("docker" , args ... )
57- cmd .Stdout = ioutil .Discard
58- cmd .Stderr = os .Stderr
59- err = cmd .Run ()
60- return imageName , err
72+ // Write app content
73+ if err := app .Extract (dir ); err != nil {
74+ return dir , errors .Wrap (err , "cannot extract app" )
75+ }
76+ return dir , nil
6177}
6278
6379// Load loads an app from docker
0 commit comments