From 2afa8b93a354d2b38de1b9d2189712a1132dab07 Mon Sep 17 00:00:00 2001 From: Samuel K Date: Sun, 3 May 2026 18:10:00 -0500 Subject: [PATCH] feat(up): add --gpu-availability flag to override GPU detection Allow users to force GPU availability to "true" or "false" instead of relying on Docker auto-detection, matching the official devcontainer CLI behavior. The override is threaded through both the single-container and compose code paths. --- cmd/up.go | 3 +++ pkg/devcontainer/compose.go | 14 +++++++++++++- pkg/devcontainer/single.go | 1 + pkg/driver/docker.go | 1 + pkg/driver/docker/docker.go | 17 +++++++++++++++-- pkg/provider/workspace.go | 1 + 6 files changed, 34 insertions(+), 3 deletions(-) diff --git a/cmd/up.go b/cmd/up.go index 7a74e95ce..d87f3050c 100644 --- a/cmd/up.go +++ b/cmd/up.go @@ -211,6 +211,9 @@ func (cmd *UpCmd) registerDevContainerFlags(upCmd *cobra.Command) { upCmd.Flags(). StringVar(&cmd.DefaultUserEnvProbe, "default-user-env-probe", "", "Override userEnvProbe from devcontainer.json (loginInteractiveShell, loginShell, interactiveShell, none)") + upCmd.Flags(). + StringVar(&cmd.GPUAvailability, "gpu-availability", "", + "Override GPU availability detection (detect, true, false)") } func (cmd *UpCmd) registerIDEFlags(upCmd *cobra.Command) { diff --git a/pkg/devcontainer/compose.go b/pkg/devcontainer/compose.go index 204f8106c..78ada728a 100644 --- a/pkg/devcontainer/compose.go +++ b/pkg/devcontainer/compose.go @@ -1135,7 +1135,7 @@ exec "$$@" overrideService.Privileged = *mergedConfig.Privileged } - gpuSupportEnabled, _ := composeHelper.Docker.GPUSupportEnabled() + gpuSupportEnabled := r.resolveComposeGPUAvailability(composeHelper) r.configureGPUResources(parsedConfig, gpuSupportEnabled, overrideService) for _, mount := range mergedConfig.Mounts { @@ -1172,6 +1172,18 @@ exec "$$@" return project } +func (r *runner) resolveComposeGPUAvailability(composeHelper *compose.ComposeHelper) bool { + switch r.WorkspaceConfig.CLIOptions.GPUAvailability { + case stringTrue: + return true + case stringFalse: + return false + default: + available, _ := composeHelper.Docker.GPUSupportEnabled() + return available + } +} + func (r *runner) configureGPUResources( parsedConfig *config.SubstitutedConfig, gpuSupportEnabled bool, diff --git a/pkg/devcontainer/single.go b/pkg/devcontainer/single.go index 0159229d5..f1725b9c4 100644 --- a/pkg/devcontainer/single.go +++ b/pkg/devcontainer/single.go @@ -373,6 +373,7 @@ func (r *runner) runContainer( IDE: r.WorkspaceConfig.Workspace.IDE.Name, IDEOptions: r.WorkspaceConfig.Workspace.IDE.Options, LocalWorkspaceFolder: r.LocalWorkspaceFolder, + GPUAvailability: r.WorkspaceConfig.CLIOptions.GPUAvailability, }) } diff --git a/pkg/driver/docker.go b/pkg/driver/docker.go index f3314633e..100a06cba 100644 --- a/pkg/driver/docker.go +++ b/pkg/driver/docker.go @@ -19,6 +19,7 @@ type RunDockerDevContainerParams struct { IDE string IDEOptions map[string]config2.OptionValue LocalWorkspaceFolder string + GPUAvailability string } type BuildRequest struct { diff --git a/pkg/driver/docker/docker.go b/pkg/driver/docker/docker.go index 21cd8bdc5..3adbdb2f2 100644 --- a/pkg/driver/docker/docker.go +++ b/pkg/driver/docker/docker.go @@ -576,7 +576,7 @@ func (b *runArgsBuilder) addLabels() *runArgsBuilder { } func (b *runArgsBuilder) addGPU() *runArgsBuilder { - b.args = appendGPUOptions(b.params.ParsedConfig, b.driver, b.args) + b.args = appendGPUOptions(b.params.ParsedConfig, b.driver, b.args, b.params.GPUAvailability) return b } @@ -788,13 +788,26 @@ func (d *dockerDriver) startContainer( return nil } +func resolveGPUAvailability(override string, d *dockerDriver) bool { + switch override { + case "true": + return true + case "false": + return false + default: + available, _ := d.Docker.GPUSupportEnabled() + return available + } +} + func appendGPUOptions( parsedConfig *config.DevContainerConfig, d *dockerDriver, args []string, + gpuAvailabilityOverride string, ) []string { if parsedConfig.HostRequirements != nil { - gpuAvailable, _ := d.Docker.GPUSupportEnabled() + gpuAvailable := resolveGPUAvailability(gpuAvailabilityOverride, d) enableGPU, warnIfMissing := parsedConfig.HostRequirements.ShouldEnableGPU(gpuAvailable) if enableGPU { args = append(args, "--gpus", "all") diff --git a/pkg/provider/workspace.go b/pkg/provider/workspace.go index 2400c058c..cebab0f49 100644 --- a/pkg/provider/workspace.go +++ b/pkg/provider/workspace.go @@ -237,6 +237,7 @@ type CLIOptions struct { UidMap []string `json:"uidMap,omitempty"` GidMap []string `json:"gidMap,omitempty"` IDLabels []string `json:"idLabels,omitempty"` + GPUAvailability string `json:"gpuAvailability,omitempty"` // dotfiles options DotfilesRepo string `json:"dotfilesRepo,omitempty"`