github.com/nektos/act@v0.2.63-0.20240520024548-8acde99bfa9c/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 "github.com/docker/docker/api/types" 10 "github.com/docker/docker/client" 11 ) 12 13 // ImageExistsLocally returns a boolean indicating if an image with the 14 // requested name, tag and architecture exists in the local docker image store 15 func ImageExistsLocally(ctx context.Context, imageName string, platform string) (bool, error) { 16 cli, err := GetDockerClient(ctx) 17 if err != nil { 18 return false, err 19 } 20 defer cli.Close() 21 22 inspectImage, _, err := cli.ImageInspectWithRaw(ctx, imageName) 23 if client.IsErrNotFound(err) { 24 return false, nil 25 } else if err != nil { 26 return false, err 27 } 28 29 if platform == "" || platform == "any" || fmt.Sprintf("%s/%s", inspectImage.Os, inspectImage.Architecture) == platform { 30 return true, nil 31 } 32 33 return false, nil 34 } 35 36 // RemoveImage removes image from local store, the function is used to run different 37 // container image architectures 38 func RemoveImage(ctx context.Context, imageName string, force bool, pruneChildren bool) (bool, error) { 39 cli, err := GetDockerClient(ctx) 40 if err != nil { 41 return false, err 42 } 43 defer cli.Close() 44 45 inspectImage, _, err := cli.ImageInspectWithRaw(ctx, imageName) 46 if client.IsErrNotFound(err) { 47 return false, nil 48 } else if err != nil { 49 return false, err 50 } 51 52 if _, err = cli.ImageRemove(ctx, inspectImage.ID, types.ImageRemoveOptions{ 53 Force: force, 54 PruneChildren: pruneChildren, 55 }); err != nil { 56 return false, err 57 } 58 59 return true, nil 60 }