github.com/simonferquel/app@v0.6.1-0.20181012141724-68b7cccf26ac/internal/image/image.go (about)

     1  package image
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"os/exec"
     7  	"path/filepath"
     8  
     9  	"github.com/docker/app/internal/slices"
    10  	composetypes "github.com/docker/cli/cli/compose/types"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  // Add add service images to the app package
    15  func Add(appname string, services []string, config *composetypes.Config) error {
    16  	if err := os.Mkdir(filepath.Join(appname, "images"), 0755); err != nil {
    17  		return errors.Wrap(err, "cannot create 'images' folder")
    18  	}
    19  	for _, s := range config.Services {
    20  		if len(services) != 0 && !slices.ContainsString(services, s.Name) {
    21  			continue
    22  		}
    23  		cmd := exec.Command("docker", "save", "-o", filepath.Join(appname, "images", s.Name), s.Image)
    24  		output, err := cmd.CombinedOutput()
    25  		if err != nil {
    26  			fmt.Println(output)
    27  			return err
    28  		}
    29  	}
    30  	return nil
    31  }
    32  
    33  // Load loads app packed images to the docker daemon
    34  func Load(appname string, services []string) error {
    35  	imageDir, err := os.Open(filepath.Join(appname, "images"))
    36  	if err != nil {
    37  		return fmt.Errorf("no images found in app")
    38  	}
    39  	defer imageDir.Close()
    40  	images, err := imageDir.Readdirnames(0)
    41  	if err != nil {
    42  		return err
    43  	}
    44  	for _, i := range images {
    45  		if len(services) != 0 && !slices.ContainsString(services, i) {
    46  			continue
    47  		}
    48  		cmd := exec.Command("docker", "load", "-i", filepath.Join(appname, "images", i))
    49  		output, err := cmd.CombinedOutput()
    50  		if err != nil {
    51  			fmt.Println(output)
    52  			return err
    53  		}
    54  	}
    55  	return nil
    56  }