将PowerShell变量传递给Docker命令

时间:2018-02-03 15:35:22

标签: powershell docker containers

我想编写Docker容器的管理脚本,但我发现很难将PS变量传递给Docker命令,特别是由于路径格式不同。

以下行(*)和您可以找到的here之类的内容确实有效,但不方便:

Start-Process docker " run --rm -v $($env:USERPROFILE -replace '\\','/'):/data alpine ls /data"

事实上,PS Start-Process非常适合MSI安装程序,您需要查看弹出窗口并控制其可见性级别,以便了解静默安装程序的运行情况。相反,您不希望每次运行控制台应用程序时都启动新窗口,特别是在Docker中,您可以在其中与来电者和被叫shell进行来回互动。

"Run a command, script, or script block" PS specifically provides &, "the call operator, also known as the 'invocation operator'"。但是,我试图没有成功:

& docker run --rm -v $($env:USERPROFILE -replace '\\','/'):/data alpine ls /data

Cmd.exe可能会使事情变得更容易,但PowerShell是与Docker for Windows交互的官方shell。因此,应该有一种可靠的方法将变量参数传递给Docker命令。

(*)此处使用移除开关-rm仅用于尝试避免使工作区混乱的答案。当然,我通常不会在创建容器时立即销毁它,而是通过-ti与它进行交互。

修改

@AnsgarWiechers在评论中提出parameters splatting

$params = 'run',  '--rm', "-v $($env:USERPROFILE -replace '\\','/'):/data", 'alpine', 'ls /data'
docker  @params

假设我正确地实施它,它也不起作用并给出:

C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: invalid mode: /data.        
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.                                        

1 个答案:

答案 0 :(得分:3)

不需要参数splatting甚至是调用操作符,双引号求解:

docker run --rm -v "$($env:USERPROFILE -replace '\\','/'):/data" alpine ls /data