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

Commit 3b66b4e

Browse files
author
Matthieu Nottale
committed
image-add, image-load: New commands.
Signed-off-by: Matthieu Nottale <[email protected]>
1 parent dd16766 commit 3b66b4e

File tree

3 files changed

+159
-0
lines changed

3 files changed

+159
-0
lines changed

cmd/image-add.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
8+
"github.com/docker/lunchbox/image"
9+
"github.com/spf13/cobra"
10+
)
11+
12+
var imageAddCmd = &cobra.Command{
13+
Use: "image-add <app-name> [services...]",
14+
Short: "Add images for given services (default: all) to the app package",
15+
Args: cobra.MinimumNArgs(1),
16+
Run: func(cmd *cobra.Command, args []string) {
17+
d := make(map[string]string)
18+
for _, v := range imageAddEnv {
19+
kv := strings.SplitN(v, "=", 2)
20+
if len(kv) != 2 {
21+
fmt.Printf("Malformed env input: '%s'\n", v)
22+
os.Exit(1)
23+
}
24+
d[kv[0]] = kv[1]
25+
}
26+
err := image.Add(args[0], args[1:], imageAddComposeFiles, imageAddSettingsFile, d)
27+
if err != nil {
28+
fmt.Printf("%v\n", err)
29+
os.Exit(1)
30+
}
31+
},
32+
}
33+
var imageAddComposeFiles []string
34+
var imageAddSettingsFile []string
35+
var imageAddEnv []string
36+
37+
func init() {
38+
rootCmd.AddCommand(imageAddCmd)
39+
imageAddCmd.Flags().StringArrayVarP(&imageAddComposeFiles, "compose-files", "c", []string{}, "Override Compose files")
40+
imageAddCmd.Flags().StringArrayVarP(&imageAddSettingsFile, "settings-files", "s", []string{}, "Override settings files")
41+
imageAddCmd.Flags().StringArrayVarP(&imageAddEnv, "env", "e", []string{}, "Override environment values")
42+
}

cmd/image-load.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"github.com/docker/lunchbox/image"
8+
"github.com/spf13/cobra"
9+
)
10+
11+
var imageLoadCmd = &cobra.Command{
12+
Use: "image-load <app-name> [services...]",
13+
Short: "Load stored images for given services (default: all) to the local docker daemon",
14+
Args: cobra.MinimumNArgs(1),
15+
Run: func(cmd *cobra.Command, args []string) {
16+
err := image.Load(args[0], args[1:])
17+
if err != nil {
18+
fmt.Printf("%v\n", err)
19+
os.Exit(1)
20+
}
21+
},
22+
}
23+
24+
func init() {
25+
rootCmd.AddCommand(imageLoadCmd)
26+
}

image/image.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package image
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"os/exec"
7+
"path"
8+
9+
"github.com/docker/lunchbox/packager"
10+
"github.com/docker/lunchbox/renderer"
11+
"github.com/docker/lunchbox/utils"
12+
)
13+
14+
func contains(list []string, needle string) bool {
15+
for _, e := range list {
16+
if e == needle {
17+
return true
18+
}
19+
}
20+
return false
21+
}
22+
23+
// Add add service images to the app package
24+
func Add(appname string, services []string, composeFiles []string, settingsFile []string, env map[string]string) error {
25+
oappname := appname
26+
appname, cleanup, err := packager.Extract(appname)
27+
if err != nil {
28+
return err
29+
}
30+
defer cleanup()
31+
config, err := renderer.Render(appname, composeFiles, settingsFile, env)
32+
if err != nil {
33+
return err
34+
}
35+
os.Mkdir(path.Join(appname, "images"), 0755)
36+
for _, s := range config.Services {
37+
if len(services) != 0 && !contains(services, s.Name) {
38+
continue
39+
}
40+
cmd := exec.Command("docker", "save", "-o", path.Join(appname, "images", s.Name), s.Image)
41+
output, err := cmd.CombinedOutput()
42+
if err != nil {
43+
fmt.Println(output)
44+
return err
45+
}
46+
}
47+
// check if source was a tarball
48+
s, err := os.Stat(oappname)
49+
if err != nil {
50+
// try appending our extension
51+
oappname = utils.DirNameFromAppName(oappname)
52+
s, err = os.Stat(oappname)
53+
}
54+
if err != nil {
55+
return err // this shouldn't happen
56+
}
57+
if !s.IsDir() {
58+
// source was a tarball, rebuild it
59+
return packager.Pack(appname, oappname)
60+
}
61+
return nil
62+
}
63+
64+
// Load loads app packed images to the docker daemon
65+
func Load(appname string, services []string) error {
66+
appname, cleanup, err := packager.Extract(appname)
67+
if err != nil {
68+
return err
69+
}
70+
defer cleanup()
71+
imageDir, err := os.Open(path.Join(appname, "images"))
72+
if err != nil {
73+
return fmt.Errorf("no images found in app")
74+
}
75+
images, err := imageDir.Readdirnames(0)
76+
if err != nil {
77+
return err
78+
}
79+
for _, i := range images {
80+
if len(services) != 0 && !contains(services, i) {
81+
continue
82+
}
83+
cmd := exec.Command("docker", "load", "-i", path.Join(appname, "images", i))
84+
output, err := cmd.CombinedOutput()
85+
if err != nil {
86+
fmt.Println(output)
87+
return err
88+
}
89+
}
90+
return nil
91+
}

0 commit comments

Comments
 (0)