summaryrefslogtreecommitdiffstats
path: root/pkg/container/docker_images.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/container/docker_images.go')
-rw-r--r--pkg/container/docker_images.go60
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
+}