hmdeploy/docker/client.go
2025-04-02 10:20:05 +02:00

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
}