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 }