一尘不染

将PowerShell变量传递给Docker命令

docker

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

以下行(*)和您可以在此处找到的赞都可以 使用,但是很不方便:

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

的确,PS Start- Process非常适合MSI安装程序,您需要查看弹出窗口并控制其可见性级别,以便了解无提示安装程序正在运行。取而代之的是,您不想每次运行控制台应用程序时都启动一个新窗口,尤其是在Docker中,在其中您与调用程序和被调用shell来回交互。

PS&“运行命令,脚本或脚本块”特别提供了“调用操作符,也称为’调用操作符’”。但是,我尝试使用以下方法未成功:

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

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

(*)-rm此处,remove开关仅用于试验答案以避免混乱工作空间的目的。当然,我通常不会在创建容器后立即销毁它,而是与它经过的容器进行交互
-ti

编辑

@AnsgarWiechers 在评论中建议使用参数展开

$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'.

阅读 343

收藏
2020-06-17

共1个答案

一尘不染

不需要参数拼写甚至调用运算符,双引号可以解决:

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