package container import ( "context" "encoding/json" "fmt" "io" "git.netflux.io/rob/octoplex/internal/domain" "github.com/docker/docker/api/types/image" ) func handleImagePull( ctx context.Context, imageName string, dockerClient DockerClient, containerStateC chan<- domain.Container, ) error { containerStateC <- domain.Container{ Status: domain.ContainerStatusPulling, ImageName: imageName, PullStatus: "Waiting", } pullReader, err := dockerClient.ImagePull(ctx, imageName, image.PullOptions{}) if err != nil { return err } pullDecoder := json.NewDecoder(pullReader) var pp pullProgress for { if err := pullDecoder.Decode(&pp); err != nil { if err == io.EOF { break } return fmt.Errorf("image pull: %w", err) } if pp.Progress != "" { containerStateC <- domain.Container{ Status: domain.ContainerStatusPulling, ImageName: imageName, PullStatus: pp.Status, PullProgress: pp.Progress, PullPercent: int(pp.Detail.Curr * 100 / pp.Detail.Total), } } } _ = pullReader.Close() return nil }