将PowerShell变量传递给Docker命令

6

我希望能够编写脚本来管理Docker容器,但我发现将PS变量传递给Docker命令很困难,尤其是由于路径格式的差异。

以下代码 (*) 和类似代码可以在这里找到,虽然它们可行,但不太方便:

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

实际上,在需要查看弹出窗口并控制其可见性的MSI安装程序中,PS Start-Process 是完美的选择,以便了解静默安装正在进行。而在运行控制台应用程序时,尤其是在Docker中来回交互调用者和被调用的shell时,您不希望每次都启动一个新窗口。

要在PS中“运行命令、脚本或脚本块”,可以使用&(也称为“调用运算符”)。有关详细信息,请参阅"Run a command, script, or script block"。但是,我曾试图这样做,但未成功:

& docker run --rm -v $($env:USERPROFILE -replace '\\','/'):/data alpine ls /data
Cmd.exe或许会更加容易,但是PowerShell是与Docker for Windows交互的官方shell。因此,应该有一种可靠的方法来传递变量参数到Docker命令中。
(*) 这里仅出于实验目的使用了删除开关-rm,以避免杂乱无章地占用您的工作空间。当然,我通常不会在创建容器后立即销毁它,而是通过传递-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'.                                        

使用调用运算符和展开操作符来传递变量和处理参数通常比尝试将事物适配到“Start-Process”中要容易得多。@4c74356b41 - Ansgar Wiechers
$params = 'run', '--rm', '-v', "//$($env:USERPROFILE -replace '\','/' -replace ':'):/data", 'alpine', '"ls /data"'也许与此相关:https://dev59.com/MVwY5IYBdhLWcg3wAjw9#33151452 - Ansgar Wiechers
要明确的是,你或者其他 OP 想要运行哪个命令并不是很重要,两个问题都是关于如何从 PowerShell 执行带参数的外部命令。建议的做法是通过调用运算符调用可执行文件,并通过 splatting 传递参数。这就是为什么我将此问题标记为另一个问题的重复。 - Ansgar Wiechers
@4c74356b41: 我仍然不知道如何将splatting应用到Docker调用中,因此我在meta上开了一个问题 - antonio
所以我像这样启动我的容器:docker run -v B:\folder\otherfolder\:/home/folder ...,这个映射起作用。 - 4c74356b41
显示剩余7条评论
1个回答

5

不需要使用参数分散或甚至调用运算符,使用双引号即可解决:

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

对于cwd/pwd:...-v "$($pwd.path -replace '\\','/'):/data ..." — 在官方文档中只有Linux版本,稍作修改以适应此场景 ...-v "$(pwd)":/data... — 请参见https://docs.docker.com/storage/bind-mounts/#start-a-container-with-a-bind-mount - pavol.kutaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接