PowerShell 7.3中使用Stop Parsing调用Docker报错的解决问询
在PowerShell 7.3中正确调用Docker并解决参数解析问题
针对你遇到的PowerShell 7.3解析Docker参数报错的问题,以下两种方案可以解决:
方案一:正确使用Stop Parsing标记(--%)
--%需要紧跟在docker run之后,让PowerShell停止解析后续所有参数,直接传递给Docker。注意--%之后的参数遵循CMD的解析规则,不能再用PowerShell的$变量格式,需要改用环境变量引用:
param ( [string]$target = "build" ) Write-Host "Running npm run $target" $path = (Get-Item -Path ".\").FullName # 将PowerShell变量转为环境变量,供--%后引用 $env:DOCKER_WORK_PATH = $path $env:DOCKER_TARGET = $target # --%紧跟在docker run之后,后续参数直接传递给Docker docker run --% -it --memory="500m" --memory-swap="1g" --rm ` --mount type=bind,src="%DOCKER_WORK_PATH%\src/MyProject/wwwroot/dist",dst=/work/wwwroot/dist ` --mount type=bind,src="%DOCKER_WORK_PATH%\src/MyProject/fed/dist",dst=/work/fed/dist ` --mount type=bind,src="%DOCKER_WORK_PATH%\src/MyProject/fed/.storybook",dst=/work/fed/.storybook ` --mount type=bind,src="%DOCKER_WORK_PATH%\src/MyProject/fed/src",dst=/work/fed/src ` mytag npm run %DOCKER_TARGET% # 可选:清理临时环境变量 Remove-Item Env:\DOCKER_WORK_PATH Remove-Item Env:\DOCKER_TARGET
方案二:使用PowerShell参数拼接(Splatting)
这种方式更符合PowerShell的使用习惯,无需切换解析规则,直接通过数组传递参数,避免解析冲突:
param ( [string]$target = "build" ) Write-Host "Running npm run $target" $path = (Get-Item -Path ".\").FullName # 定义Docker参数数组,每个元素对应一个独立参数 $dockerParams = @( 'run', '-it', '--memory="500m"', '--memory-swap="1g"', '--rm', "--mount type=bind,src=`"$path\src/MyProject/wwwroot/dist`",dst=/work/wwwroot/dist", "--mount type=bind,src=`"$path\src/MyProject/fed/dist`",dst=/work/fed/dist", "--mount type=bind,src=`"$path\src/MyProject/fed/.storybook`",dst=/work/fed/.storybook", "--mount type=bind,src=`"$path\src/MyProject/fed/src`",dst=/work/fed/src", 'mytag', 'npm', 'run', $target ) # 调用Docker并传入参数数组 docker $dockerParams
错误原因说明
你之前的报错是因为--%的位置错误:如果把--%放在--mount等参数之后,PowerShell会将--mount识别为自身的命令参数而非传递给Docker,从而抛出"Missing expression after unary operator '--'"的错误。--%必须紧跟在要调用的外部命令(这里是docker run)之后,确保后续所有参数都直接交给目标程序处理。
内容的提问来源于stack exchange,提问作者Ethan Schofer
相关产品推荐
相关产品推荐

