github.com/alibaba/sealer@v0.8.6-0.20220430115802-37a2bdaa8173/pkg/infra/container/client/docker/container_image.go (about) 1 // Copyright © 2021 Alibaba Group Holding Ltd. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package docker 16 17 import ( 18 "fmt" 19 "io" 20 21 dockerstreams "github.com/docker/cli/cli/streams" 22 "github.com/docker/docker/api/types" 23 dockerjsonmessage "github.com/docker/docker/pkg/jsonmessage" 24 25 "github.com/alibaba/sealer/common" 26 "github.com/alibaba/sealer/logger" 27 ) 28 29 func (p *Provider) DeleteImageResource(imageID string) error { 30 _, err := p.DockerClient.ImageRemove(p.Ctx, imageID, types.ImageRemoveOptions{ 31 Force: true, 32 PruneChildren: true, 33 }) 34 return err 35 } 36 37 func (p *Provider) PullImage(imageName string) (string, error) { 38 // if existed, only set id no need to pull. 39 if imageID := p.GetImageIDByName(imageName); imageID != "" { 40 return imageID, nil 41 } 42 out, err := p.DockerClient.ImagePull(p.Ctx, imageName, types.ImagePullOptions{}) 43 if err != nil { 44 return "", err 45 } 46 47 defer func() { 48 _ = out.Close() 49 }() 50 51 err = dockerjsonmessage.DisplayJSONMessagesToStream(out, dockerstreams.NewOut(common.StdOut), nil) 52 if err != nil && err != io.ErrClosedPipe { 53 logger.Warn("error occurs in display progressing, err: %s", err) 54 } 55 logger.Info("success to pull docker image: %s ", imageName) 56 57 imageID := p.GetImageIDByName(imageName) 58 if imageID != "" { 59 return imageID, nil 60 } 61 62 return "", fmt.Errorf("failed to pull image:%s", imageName) 63 } 64 65 func (p *Provider) GetImageIDByName(name string) string { 66 images, err := p.DockerClient.ImageList(p.Ctx, types.ImageListOptions{}) 67 if err != nil { 68 return "" 69 } 70 for _, ima := range images { 71 named := ima.RepoTags 72 for _, imaName := range named { 73 if imaName == name { 74 return ima.ID 75 } 76 } 77 } 78 return "" 79 } 80 81 func (p *Provider) GetImageResourceByID(id string) (*types.ImageInspect, error) { 82 image, _, err := p.DockerClient.ImageInspectWithRaw(p.Ctx, id) 83 return &image, err 84 }