portainer/portainer

View on GitHub
api/docker/images/puller.go

Summary

Maintainability
A
0 mins
Test Coverage
package images

import (
    "context"
    "io"

    "github.com/portainer/portainer/api/dataservices"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
    "github.com/rs/zerolog/log"
)

type Puller struct {
    client         *client.Client
    registryClient *RegistryClient
    dataStore      dataservices.DataStore
}

func NewPuller(client *client.Client, registryClient *RegistryClient, dataStore dataservices.DataStore) *Puller {
    return &Puller{
        client:         client,
        registryClient: registryClient,
        dataStore:      dataStore,
    }
}

func (puller *Puller) Pull(ctx context.Context, image Image) error {
    log.Debug().Str("image", image.FullName()).Msg("starting to pull the image")

    registryAuth, err := puller.registryClient.EncodedRegistryAuth(image)
    if err != nil {
        log.Debug().
            Str("image", image.FullName()).
            Err(err).
            Msg("failed to get an encoded registry auth via image, try to pull image without registry auth")
    }

    out, err := puller.client.ImagePull(ctx, image.FullName(), types.ImagePullOptions{
        RegistryAuth: registryAuth,
    })
    if err != nil {
        return err
    }
    defer out.Close()

    _, err = io.ReadAll(out)

    return err
}