@@ -13,6 +13,7 @@ import (
1313 v1 "github.com/google/go-containerregistry/pkg/v1"
1414 "github.com/google/go-containerregistry/pkg/v1/daemon"
1515 "github.com/google/go-containerregistry/pkg/v1/remote"
16+ dockerclient "github.com/moby/moby/client"
1617
1718 "github.com/stackrox/roxie/internal/logger"
1819)
@@ -41,7 +42,7 @@ func VerifyImageExistence(ctx context.Context, log *logger.Logger, imageRef stri
4142
4243// ExtractManifestsFromImage extracts the /manifests/ directory from an operator bundle image.
4344// Authentication is handled automatically from ~/.docker/config.json or $REGISTRY_AUTH_FILE.
44- func ExtractManifestsFromImage (ctx context.Context , log * logger.Logger , imageRef , destDir string ) error {
45+ func ExtractManifestsFromImage (ctx context.Context , log * logger.Logger , imageRef , destDir , containerRuntimeSocket string ) error {
4546 tempDir , err := os .MkdirTemp ("" , "oci-image-" )
4647 if err != nil {
4748 return fmt .Errorf ("failed to create temp dir: %w" , err )
@@ -50,7 +51,7 @@ func ExtractManifestsFromImage(ctx context.Context, log *logger.Logger, imageRef
5051
5152 log .Dimf ("Using temporary directory: %s" , tempDir )
5253
53- img , err := assureImageExistsLocally (ctx , log , imageRef )
54+ img , err := assureImageExistsLocally (ctx , log , imageRef , containerRuntimeSocket )
5455 if err != nil {
5556 return err
5657 }
@@ -64,15 +65,25 @@ func ExtractManifestsFromImage(ctx context.Context, log *logger.Logger, imageRef
6465 return nil
6566}
6667
67- func assureImageExistsLocally (ctx context.Context , log * logger.Logger , imageRef string ) (v1.Image , error ) {
68+ func assureImageExistsLocally (ctx context.Context , log * logger.Logger , imageRef , containerRuntimeSocket string ) (v1.Image , error ) {
6869 log .Dimf ("Fetching image %s" , imageRef )
6970
7071 ref , err := name .ParseReference (imageRef )
7172 if err != nil {
7273 return nil , fmt .Errorf ("invalid image reference: %w" , err )
7374 }
7475
75- img , err := daemon .Image (ref , daemon .WithContext (ctx ))
76+ daemonOpts := []daemon.Option {daemon .WithContext (ctx )}
77+ if containerRuntimeSocket != "" {
78+ client , err := dockerclient .New (dockerclient .WithHost (containerRuntimeSocket ))
79+ if err == nil {
80+ daemonOpts = append (daemonOpts , daemon .WithClient (client ))
81+ } else {
82+ log .Dimf ("Failed to create moby client for %s: %v" , containerRuntimeSocket , err )
83+ }
84+ }
85+
86+ img , err := daemon .Image (ref , daemonOpts ... )
7687 if err == nil {
7788 log .Dimf ("✓ Image %s found in local daemon" , imageRef )
7889 return img , nil
0 commit comments