【发布时间】:2018-02-03 15:35:21
【问题描述】:
我想编写 Docker 容器管理的脚本,但我发现很难将 PS 变量传递给 Docker 命令,尤其是由于路径格式差异。
以下行 (*) 和您可以找到 here 的类似行确实有效,但它们不方便:
Start-Process docker " run --rm -v $($env:USERPROFILE -replace '\\','/'):/data alpine ls /data"
确实,PS Start-Process 非常适合 MSI 安装程序,您需要查看弹出窗口并控制其可见性级别,以便了解静默安装程序正在运行。相反,您不希望每次运行控制台应用程序时都启动一个新窗口,尤其是在 Docker 中,您可以在其中与调用者和被调用 shell 来回交互。
& 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'.
【问题讨论】:
-
如果他询问路径差异,不确定这是如何重复的:
/vs\ -
@4c74356b41 使用调用运算符和 splatting 而不是尝试将内容放入
Start-Process时,通常传递变量和参数处理要容易得多。 -
好的,但他不是要求那个? @AnsgarWiechers
-
他可能没有要求,但我很确定这是他问题的实际解决方案。
-
@AnsgarWiechers:那里的 OP 要求解决方案来同步启动多个 MSI 进程。不想与静默的 MSI 安装程序交互,所以
Start-Process可以,它的弹出窗口甚至可以帮助捕捉错误。我建议自己Start-Process方法“有效”,但明确指出它“不方便”。您的控制台方法不是 OP 所要求的,并明确解释了为什么需要Start-Process解决方案。因此,那些正在寻找不是基于Start-Process的解决方案的人不会去看那里,愿意回答的人也不太可能发帖。
标签: powershell docker containers