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 }