github.com/pachyderm/pachyderm@v1.13.4/src/server/pkg/deploy/images/images.go (about)

     1  package images
     2  
     3  import (
     4  	"io"
     5  	"time"
     6  
     7  	docker "github.com/fsouza/go-dockerclient"
     8  	"github.com/pachyderm/pachyderm/src/client/pkg/errors"
     9  	"github.com/pachyderm/pachyderm/src/server/pkg/deploy/assets"
    10  )
    11  
    12  // Export a tarball of the images needed by a deployment.
    13  func Export(opts *assets.AssetOpts, out io.Writer) error {
    14  	client, err := docker.NewClientFromEnv()
    15  	if err != nil {
    16  		return err
    17  	}
    18  	authConfigs, err := docker.NewAuthConfigurationsFromDockerCfg()
    19  	if err != nil {
    20  		return errors.Wrapf(err, "error parsing auth, try running `docker login`")
    21  	}
    22  	if len(authConfigs.Configs) == 0 {
    23  		return errors.Errorf("didn't find any valid auth configurations")
    24  	}
    25  	images := assets.Images(opts)
    26  	for _, image := range images {
    27  		repository, tag := docker.ParseRepositoryTag(image)
    28  		pulled := false
    29  		var loopErr []error
    30  		for registry, authConfig := range authConfigs.Configs {
    31  			if err := client.PullImage(
    32  				docker.PullImageOptions{
    33  					Repository:        repository,
    34  					Tag:               tag,
    35  					InactivityTimeout: 5 * time.Second,
    36  				},
    37  				authConfig,
    38  			); err != nil {
    39  				loopErr = append(loopErr, errors.Wrapf(err, "error pulling from %s", registry))
    40  				continue
    41  			}
    42  			pulled = true
    43  			break
    44  		}
    45  		if !pulled {
    46  			if len(loopErr) > 0 {
    47  				return loopErr[0]
    48  			}
    49  			return errors.Errorf("failed to pull images because there are no auth configs")
    50  		}
    51  	}
    52  	return client.ExportImages(docker.ExportImagesOptions{
    53  		Names:        images,
    54  		OutputStream: out,
    55  	})
    56  }
    57  
    58  // Import a tarball of the images needed by a deployment such as the one
    59  // created by Export and push those images to the registry specific in opts.
    60  func Import(opts *assets.AssetOpts, in io.Reader) error {
    61  	client, err := docker.NewClientFromEnv()
    62  	if err != nil {
    63  		return err
    64  	}
    65  	authConfigs, err := docker.NewAuthConfigurationsFromDockerCfg()
    66  	if err != nil {
    67  		return errors.Wrapf(err, "error parsing auth, try running `docker login`")
    68  	}
    69  	if len(authConfigs.Configs) == 0 {
    70  		return errors.Errorf("didn't find any valid auth configurations")
    71  	}
    72  	if err := client.LoadImage(docker.LoadImageOptions{
    73  		InputStream: in,
    74  	}); err != nil {
    75  		return err
    76  	}
    77  	registry := opts.Registry
    78  	opts.Registry = "" // pretend we're using default images so we can get targets to tag
    79  	images := assets.Images(opts)
    80  	opts.Registry = registry
    81  	for _, image := range images {
    82  		repository, tag := docker.ParseRepositoryTag(image)
    83  		registryRepo := assets.AddRegistry(opts.Registry, repository)
    84  		if err := client.TagImage(image, docker.TagImageOptions{
    85  			Repo: registryRepo,
    86  			Tag:  tag,
    87  		},
    88  		); err != nil {
    89  			return errors.Wrapf(err, "error tagging image")
    90  		}
    91  		pushed := false
    92  		var loopErr []error
    93  		for registry, authConfig := range authConfigs.Configs {
    94  			if err := client.PushImage(
    95  				docker.PushImageOptions{
    96  					Name:              registryRepo,
    97  					Tag:               tag,
    98  					Registry:          opts.Registry,
    99  					InactivityTimeout: 5 * time.Second,
   100  				},
   101  				authConfig,
   102  			); err != nil {
   103  				loopErr = append(loopErr, errors.Wrapf(err, "error pushing to %s", registry))
   104  				continue
   105  			}
   106  			pushed = true
   107  			break
   108  		}
   109  		if !pushed {
   110  			if len(loopErr) > 0 {
   111  				return loopErr[0]
   112  			}
   113  			return errors.Errorf("failed to push images because there are no auth configs")
   114  		}
   115  	}
   116  	return nil
   117  }