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 }