|
5 | 5 |
|
6 | 6 |
|
7 | 7 | import { createContainerProperties, startEventSeen, ResolverResult, getTunnelInformation, getDockerfilePath, getDockerContextPath, DockerResolverParameters, isDockerFileConfig, uriToWSLFsPath, WorkspaceConfiguration, getFolderImageName, inspectDockerImage, logUMask, SubstitutedConfig } from './utils';
|
8 |
| -import { ContainerProperties, setupInContainer, ResolverProgress } from '../spec-common/injectHeadless'; |
| 8 | +import { ContainerProperties, setupInContainer, ResolverProgress, ResolverParameters } from '../spec-common/injectHeadless'; |
9 | 9 | import { ContainerError, toErrorText } from '../spec-common/errors';
|
10 | 10 | import { ContainerDetails, listContainers, DockerCLIParameters, inspectContainers, dockerCLI, dockerPtyCLI, toPtyExecParameters, ImageDetails, toExecParameters } from '../spec-shutdown/dockerUtils';
|
11 | 11 | import { DevContainerConfig, DevContainerFromDockerfileConfig, DevContainerFromImageConfig } from '../spec-configuration/configuration';
|
@@ -305,6 +305,22 @@ export async function findDevContainer(params: DockerCLIParameters | DockerResol
|
305 | 305 | return details.filter(container => container.State.Status !== 'removing')[0];
|
306 | 306 | }
|
307 | 307 |
|
| 308 | +export async function extraRunArgs(common: ResolverParameters, params: DockerCLIParameters | DockerResolverParameters, config: DevContainerFromDockerfileConfig | DevContainerFromImageConfig) { |
| 309 | + const extraArguments: string[] = []; |
| 310 | + if (config.hostRequirements?.gpu) { |
| 311 | + const result = await dockerCLI(params, 'info', '-f', '{{.Runtimes.nvidia}}'); |
| 312 | + const runtimeFound = result.stdout.includes('nvidia-container-runtime'); |
| 313 | + if (runtimeFound) { |
| 314 | + common.output.write(`GPU support found, add GPU flags to docker call.`); |
| 315 | + extraArguments.push('--gpus', 'all'); |
| 316 | + } else { |
| 317 | + if (config.hostRequirements?.gpu !== 'optional') { |
| 318 | + common.output.write('No GPU support found yet a GPU was required - consider marking it as "optional"', LogLevel.Warning); |
| 319 | + } |
| 320 | + } |
| 321 | + } |
| 322 | + return extraArguments; |
| 323 | +} |
308 | 324 |
|
309 | 325 | export async function spawnDevContainer(params: DockerResolverParameters, config: DevContainerFromDockerfileConfig | DevContainerFromImageConfig, mergedConfig: MergedDevContainerConfig, imageName: string, labels: string[], workspaceMount: string | undefined, imageDetails: (() => Promise<ImageDetails>) | undefined, containerUser: string | undefined) {
|
310 | 326 | const { common } = params;
|
@@ -372,6 +388,7 @@ while sleep 1 & wait $!; do :; done`, '-']; // `wait $!` allows for the `trap` t
|
372 | 388 | ...containerEnv,
|
373 | 389 | ...containerUserArgs,
|
374 | 390 | ...(config.runArgs || []),
|
| 391 | + ...(await extraRunArgs(common, params, config) || []), |
375 | 392 | ...featureArgs,
|
376 | 393 | ...entrypoint,
|
377 | 394 | imageName,
|
|
0 commit comments