diff options
Diffstat (limited to 'pkg/container/docker_images.go')
-rw-r--r-- | pkg/container/docker_images.go | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/pkg/container/docker_images.go b/pkg/container/docker_images.go new file mode 100644 index 0000000..50ec68d --- /dev/null +++ b/pkg/container/docker_images.go @@ -0,0 +1,60 @@ +//go:build !(WITHOUT_DOCKER || !(linux || darwin || windows || netbsd)) + +package container + +import ( + "context" + "fmt" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/client" +) + +// 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 string, platform string) (bool, error) { + cli, err := GetDockerClient(ctx) + if err != nil { + return false, err + } + defer cli.Close() + + inspectImage, _, err := cli.ImageInspectWithRaw(ctx, imageName) + if client.IsErrNotFound(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 bool, pruneChildren bool) (bool, error) { + cli, err := GetDockerClient(ctx) + if err != nil { + return false, err + } + defer cli.Close() + + inspectImage, _, err := cli.ImageInspectWithRaw(ctx, imageName) + if client.IsErrNotFound(err) { + return false, nil + } else if err != nil { + return false, err + } + + if _, err = cli.ImageRemove(ctx, inspectImage.ID, types.ImageRemoveOptions{ + Force: force, + PruneChildren: pruneChildren, + }); err != nil { + return false, err + } + + return true, nil +} |