mirror of https://github.com/portainer/portainer
51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
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
|
|
}
|