Skip to content

Commit 5c55743

Browse files
gfraiteurclaude
andcommitted
DockerBuild: add -Env and -Ports parameters
- Add -Env parameter to pass additional environment variables to container Supports both "NAME" (read from host) and "NAME=VALUE" (literal) forms - Add -Ports parameter for port mappings (e.g., "8080:80") - Regenerate DockerBuild.ps1 with all recent changes Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent cfd6a88 commit 5c55743

3 files changed

Lines changed: 96 additions & 2 deletions

File tree

DockerBuild.ps1

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ param(
2323
[string]$Memory, # Docker memory limit (e.g., "8g"). Only used with hyperv isolation.
2424
[int]$Cpus = [Environment]::ProcessorCount, # Docker CPU limit. Only used with hyperv isolation.
2525
[string[]]$Mount, # Additional directories to mount from host (readonly by default, append :w for writable). Supports * and ** glob patterns.
26+
[string[]]$Env, # Additional environment variables to pass from host to container.
27+
[string[]]$Ports, # Port mappings from host to container (e.g., "8080:80", "3000").
2628
[Parameter(ValueFromRemainingArguments)]
2729
[string[]]$BuildArgs # Arguments passed to `Build.ps1` within the container (or Claude prompt if -Claude is specified).
2830
)
@@ -96,16 +98,55 @@ function New-EnvJson
9698
$envVarNames = $EnvironmentVariableList -split ',' | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne '' }
9799

98100
# Build hashtable with environment variable values
101+
# CONTAINER_FOO takes precedence over FOO (allows overriding for container use)
99102
$envVariables = @{ }
100103
foreach ($envVarName in $envVarNames)
101104
{
102-
$value = [Environment]::GetEnvironmentVariable($envVarName)
105+
# Check for CONTAINER_ prefixed override first
106+
$containerVarName = "CONTAINER_$envVarName"
107+
$value = [Environment]::GetEnvironmentVariable($containerVarName)
108+
if ([string]::IsNullOrEmpty($value))
109+
{
110+
# Fall back to regular environment variable
111+
$value = [Environment]::GetEnvironmentVariable($envVarName)
112+
}
103113
if (-not [string]::IsNullOrEmpty($value))
104114
{
105115
$envVariables[$envVarName] = $value
106116
}
107117
}
108118

119+
# Process additional environment variables from -Env parameter
120+
# Supports both "NAME" (read from host) and "NAME=VALUE" (literal value) forms
121+
if ($Env -and $Env.Count -gt 0)
122+
{
123+
foreach ($envSpec in $Env)
124+
{
125+
if ($envSpec -match '^([^=]+)=(.*)$')
126+
{
127+
# NAME=VALUE form: use literal value
128+
$envVarName = $Matches[1]
129+
$value = $Matches[2]
130+
$envVariables[$envVarName] = $value
131+
}
132+
else
133+
{
134+
# NAME form: read from host environment (with CONTAINER_ prefix support)
135+
$envVarName = $envSpec
136+
$containerVarName = "CONTAINER_$envVarName"
137+
$value = [Environment]::GetEnvironmentVariable($containerVarName)
138+
if ([string]::IsNullOrEmpty($value))
139+
{
140+
$value = [Environment]::GetEnvironmentVariable($envVarName)
141+
}
142+
if (-not [string]::IsNullOrEmpty($value))
143+
{
144+
$envVariables[$envVarName] = $value
145+
}
146+
}
147+
}
148+
}
149+
109150
# Add NUGET_PACKAGES with default if not set
110151
if (-not $envVariables.ContainsKey("NUGET_PACKAGES"))
111152
{
@@ -1336,6 +1377,16 @@ if (-not $BuildImage)
13361377
$dockerCmd += $dockerArgs
13371378
$dockerCmd += $volumeArgs
13381379
$dockerCmd += $envArgs
1380+
1381+
# Add port mappings from -Ports parameter
1382+
if ($Ports -and $Ports.Count -gt 0)
1383+
{
1384+
foreach ($portMapping in $Ports)
1385+
{
1386+
$dockerCmd += @('-p', $portMapping)
1387+
}
1388+
}
1389+
13391390
if ($pwshArgs) {
13401391
$dockerCmd += @('-w', $ContainerCallingDir, $ImageTag, $pwshPath, $pwshArgs, '-Command', $inlineScript)
13411392
} else {

Dockerfile.claude

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ ENV USERPROFILE=C:\\Users\\ContainerAdministrator
8080
# Install Claude CLI and configure using cmd shell to avoid HCS issues with PowerShell
8181
SHELL ["cmd", "/S", "/C"]
8282
RUN C:\nodejs\npm.cmd install --global @anthropic-ai/claude-code@2.1.27
83-
RUN mkdir C:\Users\ContainerAdministrator\.claude && echo {"hasCompletedOnboarding": true} > C:\Users\ContainerAdministrator\.claude.json && echo {"alwaysThinkingEnabled": true} > C:\Users\ContainerAdministrator\.claude\settings.json
83+
RUN mkdir C:\Users\ContainerAdministrator\.claude && echo {"hasCompletedOnboarding": true} > C:\Users\ContainerAdministrator\.claude.json && echo {"alwaysThinkingEnabled": true, "spinnerTipsEnabled": false} > C:\Users\ContainerAdministrator\.claude\settings.json
8484

8585
# Restore PowerShell shell using full path
8686
SHELL ["C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe", "-Command"]

src/PostSharp.Engineering.BuildTools/Resources/DockerBuild.ps1

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ param(
2323
[string]$Memory, # Docker memory limit (e.g., "8g"). Only used with hyperv isolation.
2424
[int]$Cpus = [Environment]::ProcessorCount, # Docker CPU limit. Only used with hyperv isolation.
2525
[string[]]$Mount, # Additional directories to mount from host (readonly by default, append :w for writable). Supports * and ** glob patterns.
26+
[string[]]$Env, # Additional environment variables to pass from host to container.
27+
[string[]]$Ports, # Port mappings from host to container (e.g., "8080:80", "3000").
2628
[Parameter(ValueFromRemainingArguments)]
2729
[string[]]$BuildArgs # Arguments passed to `Build.ps1` within the container (or Claude prompt if -Claude is specified).
2830
)
@@ -114,6 +116,37 @@ function New-EnvJson
114116
}
115117
}
116118

119+
# Process additional environment variables from -Env parameter
120+
# Supports both "NAME" (read from host) and "NAME=VALUE" (literal value) forms
121+
if ($Env -and $Env.Count -gt 0)
122+
{
123+
foreach ($envSpec in $Env)
124+
{
125+
if ($envSpec -match '^([^=]+)=(.*)$')
126+
{
127+
# NAME=VALUE form: use literal value
128+
$envVarName = $Matches[1]
129+
$value = $Matches[2]
130+
$envVariables[$envVarName] = $value
131+
}
132+
else
133+
{
134+
# NAME form: read from host environment (with CONTAINER_ prefix support)
135+
$envVarName = $envSpec
136+
$containerVarName = "CONTAINER_$envVarName"
137+
$value = [Environment]::GetEnvironmentVariable($containerVarName)
138+
if ([string]::IsNullOrEmpty($value))
139+
{
140+
$value = [Environment]::GetEnvironmentVariable($envVarName)
141+
}
142+
if (-not [string]::IsNullOrEmpty($value))
143+
{
144+
$envVariables[$envVarName] = $value
145+
}
146+
}
147+
}
148+
}
149+
117150
# Add NUGET_PACKAGES with default if not set
118151
if (-not $envVariables.ContainsKey("NUGET_PACKAGES"))
119152
{
@@ -1344,6 +1377,16 @@ if (-not $BuildImage)
13441377
$dockerCmd += $dockerArgs
13451378
$dockerCmd += $volumeArgs
13461379
$dockerCmd += $envArgs
1380+
1381+
# Add port mappings from -Ports parameter
1382+
if ($Ports -and $Ports.Count -gt 0)
1383+
{
1384+
foreach ($portMapping in $Ports)
1385+
{
1386+
$dockerCmd += @('-p', $portMapping)
1387+
}
1388+
}
1389+
13471390
if ($pwshArgs) {
13481391
$dockerCmd += @('-w', $ContainerCallingDir, $ImageTag, $pwshPath, $pwshArgs, '-Command', $inlineScript)
13491392
} else {

0 commit comments

Comments
 (0)