47 lines
995 B
Go
47 lines
995 B
Go
package docker
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
|
|
"github.com/rs/zerolog/log"
|
|
)
|
|
|
|
type IClient interface {
|
|
Save(imageName, dest string) (string, error)
|
|
}
|
|
|
|
type Client struct{}
|
|
|
|
var _ IClient = (*Client)(nil)
|
|
|
|
func NewClient() Client {
|
|
return Client{}
|
|
}
|
|
|
|
func (c *Client) Save(imageName, dest string) (string, error) {
|
|
destInfo, err := os.Stat(dest)
|
|
if err != nil {
|
|
log.Err(err).Str("dest", dest).Msg("unable to stat dest directory")
|
|
return "", err
|
|
}
|
|
|
|
if !destInfo.IsDir() {
|
|
log.Err(err).Str("dest", dest).Msg("dest directory must be a directory")
|
|
}
|
|
|
|
tarFile := fmt.Sprintf("%s.tar", imageName)
|
|
|
|
cmd := exec.Command("docker", "save", "-o", tarFile, imageName)
|
|
cmd.Dir = dest
|
|
if _, err := cmd.Output(); err != nil {
|
|
log.Err(err).Str("image", imageName).Str("dest", dest).Msg("unable to save image into tar")
|
|
return dest, err
|
|
}
|
|
|
|
log.Info().Str("image", imageName).Str("dest", dest).Msg("image successfully saved")
|
|
return filepath.Join(dest, tarFile), nil
|
|
}
|