//go:build !(WITHOUT_DOCKER || !(linux || darwin || windows || netbsd)) package container import ( "context" "fmt" cerrdefs "github.com/containerd/errdefs" "github.com/docker/docker/api/types/image" ) // ImageExistsLocally returns a boolean indicating if an image with the // requested name, tag and architecture exists in the local docker image store func ImageExistsLocally(ctx context.Context, imageName, platform string) (bool, error) { cli, err := GetDockerClient(ctx) if err != nil { return false, err } defer cli.Close() inspectImage, err := cli.ImageInspect(ctx, imageName) if cerrdefs.IsNotFound(err) { return false, nil } else if err != nil { return false, err } if platform == "" || platform == "any" || fmt.Sprintf("%s/%s", inspectImage.Os, inspectImage.Architecture) == platform { return true, nil } return false, nil } // RemoveImage removes image from local store, the function is used to run different // container image architectures func RemoveImage(ctx context.Context, imageName string, force, pruneChildren bool) (bool, error) { cli, err := GetDockerClient(ctx) if err != nil { return false, err } defer cli.Close() inspectImage, err := cli.ImageInspect(ctx, imageName) if cerrdefs.IsNotFound(err) { return false, nil } else if err != nil { return false, err } if _, err = cli.ImageRemove(ctx, inspectImage.ID, image.RemoveOptions{ Force: force, PruneChildren: pruneChildren, }); err != nil { return false, err } return true, nil }