@@ -65,26 +65,12 @@ func newNVIDIAContainerRuntime(logger logger.Interface, cfg *config.Config, argv
6565
6666// newSpecModifier is a factory method that creates constructs an OCI spec modifer based on the provided config.
6767func newSpecModifier (logger logger.Interface , cfg * config.Config , ociSpec oci.Spec , driver * root.Driver ) (oci.SpecModifier , error ) {
68- rawSpec , err := ociSpec .Load ()
69- if err != nil {
70- return nil , fmt .Errorf ("failed to load OCI spec: %v" , err )
71- }
72-
73- image , err := image .NewCUDAImageFromSpec (
74- rawSpec ,
75- image .WithLogger (logger ),
76- image .WithAcceptDeviceListAsVolumeMounts (cfg .AcceptDeviceListAsVolumeMounts ),
77- image .WithAcceptEnvvarUnprivileged (cfg .AcceptEnvvarUnprivileged ),
78- image .WithAnnotationsPrefixes (cfg .NVIDIAContainerRuntimeConfig .Modes .CDI .AnnotationPrefixes ),
79- )
68+ mode , image , err := initRuntimeModeAndImage (logger , cfg , ociSpec )
8069 if err != nil {
8170 return nil , err
8271 }
8372
84- mode := info .ResolveAutoMode (logger , cfg .NVIDIAContainerRuntimeConfig .Mode , image )
85- // We update the mode here so that we can continue passing just the config to other functions.
86- cfg .NVIDIAContainerRuntimeConfig .Mode = mode
87- modeModifier , err := newModeModifier (logger , mode , cfg , image )
73+ modeModifier , err := newModeModifier (logger , mode , cfg , * image )
8874 if err != nil {
8975 return nil , err
9076 }
@@ -98,13 +84,13 @@ func newSpecModifier(logger logger.Interface, cfg *config.Config, ociSpec oci.Sp
9884 case "nvidia-hook-remover" :
9985 modifiers = append (modifiers , modifier .NewNvidiaContainerRuntimeHookRemover (logger ))
10086 case "graphics" :
101- graphicsModifier , err := modifier .NewGraphicsModifier (logger , cfg , image , driver , hookCreator )
87+ graphicsModifier , err := modifier .NewGraphicsModifier (logger , cfg , * image , driver , hookCreator )
10288 if err != nil {
10389 return nil , err
10490 }
10591 modifiers = append (modifiers , graphicsModifier )
10692 case "feature-gated" :
107- featureGatedModifier , err := modifier .NewFeatureGatedModifier (logger , cfg , image , driver , hookCreator )
93+ featureGatedModifier , err := modifier .NewFeatureGatedModifier (logger , cfg , * image , driver , hookCreator )
10894 if err != nil {
10995 return nil , err
11096 }
@@ -128,6 +114,45 @@ func newModeModifier(logger logger.Interface, mode string, cfg *config.Config, i
128114 return nil , fmt .Errorf ("invalid runtime mode: %v" , cfg .NVIDIAContainerRuntimeConfig .Mode )
129115}
130116
117+ // initRuntimeModeAndImage constructs an image from the specified OCI runtime
118+ // specification and runtime config.
119+ // The image is also used to determine the runtime mode to apply.
120+ // If a non-CDI mode is detected we ensure that the image does not process
121+ // annotation devices.
122+ func initRuntimeModeAndImage (logger logger.Interface , cfg * config.Config , ociSpec oci.Spec ) (string , * image.CUDA , error ) {
123+ rawSpec , err := ociSpec .Load ()
124+ if err != nil {
125+ return "" , nil , fmt .Errorf ("failed to load OCI spec: %v" , err )
126+ }
127+
128+ image , err := image .NewCUDAImageFromSpec (
129+ rawSpec ,
130+ image .WithLogger (logger ),
131+ image .WithAcceptDeviceListAsVolumeMounts (cfg .AcceptDeviceListAsVolumeMounts ),
132+ image .WithAcceptEnvvarUnprivileged (cfg .AcceptEnvvarUnprivileged ),
133+ image .WithAnnotationsPrefixes (cfg .NVIDIAContainerRuntimeConfig .Modes .CDI .AnnotationPrefixes ),
134+ )
135+ if err != nil {
136+ return "" , nil , err
137+ }
138+
139+ mode := info .ResolveAutoMode (logger , cfg .NVIDIAContainerRuntimeConfig .Mode , image )
140+ // We update the mode here so that we can continue passing just the config to other functions.
141+ cfg .NVIDIAContainerRuntimeConfig .Mode = mode
142+
143+ if mode == "cdi" || len (cfg .NVIDIAContainerRuntimeConfig .Modes .CDI .AnnotationPrefixes ) == 0 {
144+ return mode , & image , nil
145+ }
146+
147+ // For non-cdi modes we explicitly set the annotation prefixes to nil and
148+ // call this function again to force a reconstruction of the image.
149+ // Note that since the mode is now explicitly set, we will effectively skip
150+ // the mode resolution.
151+ cfg .NVIDIAContainerRuntimeConfig .Modes .CDI .AnnotationPrefixes = nil
152+
153+ return initRuntimeModeAndImage (logger , cfg , ociSpec )
154+ }
155+
131156// supportedModifierTypes returns the modifiers supported for a specific runtime mode.
132157func supportedModifierTypes (mode string ) []string {
133158 switch mode {
0 commit comments