github.com/nektos/act@v0.2.83/pkg/container/docker_images.go (about)

     1  //go:build !(WITHOUT_DOCKER || !(linux || darwin || windows || netbsd))
     2  
     3  package container
     4  
     5  import (
     6  	"context"
     7  	"fmt"
     8  
     9  	cerrdefs "github.com/containerd/errdefs"
    10  	"github.com/docker/docker/api/types/image"
    11  	"github.com/nektos/act/pkg/common"
    12  )
    13  
    14  // ImageExistsLocally returns a boolean indicating if an image with the
    15  // requested name, tag and architecture exists in the local docker image store
    16  func ImageExistsLocally(ctx context.Context, imageName string, platform string) (bool, error) {
    17  	cli, err := GetDockerClient(ctx)
    18  	if err != nil {
    19  		return false, err
    20  	}
    21  	defer cli.Close()
    22  
    23  	inspectImage, err := cli.ImageInspect(ctx, imageName)
    24  	if cerrdefs.IsNotFound(err) {
    25  		return false, nil
    26  	} else if err != nil {
    27  		return false, err
    28  	}
    29  
    30  	imagePlatform := fmt.Sprintf("%s/%s", inspectImage.Os, inspectImage.Architecture)
    31  
    32  	if platform == "" || platform == "any" || imagePlatform == platform {
    33  		return true, nil
    34  	}
    35  
    36  	logger := common.Logger(ctx)
    37  	logger.Infof("image found but platform does not match: %s (image) != %s (platform)\n", imagePlatform, platform)
    38  
    39  	return false, nil
    40  }
    41  
    42  // RemoveImage removes image from local store, the function is used to run different
    43  // container image architectures
    44  func RemoveImage(ctx context.Context, imageName string, force bool, pruneChildren bool) (bool, error) {
    45  	cli, err := GetDockerClient(ctx)
    46  	if err != nil {
    47  		return false, err
    48  	}
    49  	defer cli.Close()
    50  
    51  	inspectImage, err := cli.ImageInspect(ctx, imageName)
    52  	if cerrdefs.IsNotFound(err) {
    53  		return false, nil
    54  	} else if err != nil {
    55  		return false, err
    56  	}
    57  
    58  	if _, err = cli.ImageRemove(ctx, inspectImage.ID, image.RemoveOptions{
    59  		Force:         force,
    60  		PruneChildren: pruneChildren,
    61  	}); err != nil {
    62  		return false, err
    63  	}
    64  
    65  	return true, nil
    66  }