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  }