Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 48c0769

Browse files
authored
Merge pull request #352 from vdemeester/351-fix-save
Fix `docker-app save` on single-file application
2 parents 643134b + a8a9779 commit 48c0769

3 files changed

Lines changed: 65 additions & 14 deletions

File tree

e2e/commands_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,20 @@ import (
1717
"gotest.tools/icmd"
1818
)
1919

20+
const (
21+
singleFileApp = `version: 0.1.0
22+
name: helloworld
23+
description: "hello world app"
24+
namespace: "foo"
25+
---
26+
version: '3.5'
27+
services:
28+
hello-world:
29+
image: hello-world
30+
---
31+
# This section contains the default values for your application settings.`
32+
)
33+
2034
// just run a command discarding everything
2135
func runCommand(exe string, args ...string) {
2236
cmd := exec.Command(exe, args...)
@@ -303,6 +317,13 @@ func TestImageBinary(t *testing.T) {
303317
assertCommand(t, dockerApp, "inspect", "alice/envvariables.dockerapp:0.1.0")
304318
}
305319

320+
func TestSaveBinary(t *testing.T) {
321+
dir := fs.NewDir(t, "save-prepare-build", fs.WithFile("my.dockerapp", singleFileApp))
322+
defer dir.Remove()
323+
dockerApp, _ := getDockerAppBinary(t)
324+
assertCommand(t, dockerApp, "save", dir.Join("my.dockerapp"))
325+
}
326+
306327
func TestForkBinary(t *testing.T) {
307328
dockerApp, _ := getDockerAppBinary(t)
308329
r := startRegistry(t)

internal/packager/registry.go

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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(`
3954
FROM scratch
4055
LABEL %s=%s
4156
LABEL maintainers="%v"
4257
COPY / /
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

types/types.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,20 @@ func (a *App) Metadata() []byte {
3939
return a.metadataContent
4040
}
4141

42+
// Extract writes the app in the specified folder
43+
func (a *App) Extract(path string) error {
44+
if err := ioutil.WriteFile(filepath.Join(path, internal.MetadataFileName), a.Metadata(), 0644); err != nil {
45+
return err
46+
}
47+
if err := ioutil.WriteFile(filepath.Join(path, internal.ComposeFileName), a.Composes()[0], 0644); err != nil {
48+
return err
49+
}
50+
if err := ioutil.WriteFile(filepath.Join(path, internal.SettingsFileName), a.Settings()[0], 0644); err != nil {
51+
return err
52+
}
53+
return nil
54+
}
55+
4256
func noop() {}
4357

4458
// NewApp creates a new docker app with the specified path and struct modifiers

0 commit comments

Comments
 (0)