1{
2 deviceNameStrategy,
3 glibc,
4 jq,
5 lib,
6 mounts,
7 nvidia-container-toolkit,
8 nvidia-driver,
9 runtimeShell,
10 writeScriptBin,
11}:
12let
13 mkMount =
14 {
15 hostPath,
16 containerPath,
17 mountOptions,
18 }:
19 {
20 inherit hostPath containerPath;
21 options = mountOptions;
22 };
23 mountToCommand =
24 mount:
25 "additionalMount \"${mount.hostPath}\" \"${mount.containerPath}\" '${builtins.toJSON mount.mountOptions}'";
26 mountsToCommands =
27 mounts:
28 if (builtins.length mounts) == 0 then
29 "cat"
30 else
31 (lib.strings.concatMapStringsSep " | \\\n" mountToCommand mounts);
32in
33writeScriptBin "nvidia-cdi-generator" ''
34 #! ${runtimeShell}
35
36 function cdiGenerate {
37 ${lib.getExe' nvidia-container-toolkit "nvidia-ctk"} cdi generate \
38 --format json \
39 --device-name-strategy ${deviceNameStrategy} \
40 --ldconfig-path ${lib.getExe' glibc "ldconfig"} \
41 --library-search-path ${lib.getLib nvidia-driver}/lib \
42 --nvidia-cdi-hook-path ${lib.getExe' nvidia-container-toolkit.tools "nvidia-cdi-hook"}
43 }
44
45 function additionalMount {
46 local hostPath="$1"
47 local containerPath="$2"
48 local mountOptions="$3"
49 if [ -e "$hostPath" ]; then
50 ${lib.getExe jq} ".containerEdits.mounts[.containerEdits.mounts | length] = { \"hostPath\": \"$hostPath\", \"containerPath\": \"$containerPath\", \"options\": $mountOptions }"
51 else
52 echo "Mount $hostPath ignored: could not find path in the host machine" >&2
53 cat
54 fi
55 }
56
57 cdiGenerate |
58 ${mountsToCommands mounts} > $RUNTIME_DIRECTORY/nvidia-container-toolkit.json
59''