【问题标题】:Pass PowerShell variables to Docker commands将 PowerShell 变量传递给 Docker 命令
【发布时间】: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 来回交互。

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

【问题讨论】:

  • 如果他询问路径差异,不确定这是如何重复的:/ vs \
  • @4c74356b41 使用调用运算符和 splatting 而不是尝试将内容放入 Start-Process 时,通常传递变量和参数处理要容易得多。
  • 好的,但他不是要求那个? @AnsgarWiechers
  • 他可能没有要求,但我很确定这是他问题的实际解决方案。
  • @AnsgarWiechers:那里的 OP 要求解决方案来同步启动多个 MSI 进程。不想与静默的 MSI 安装程序交互,所以Start-Process 可以,它的弹出窗口甚至可以帮助捕捉错误。我建议自己Start-Process 方法“有效”,但明确指出它“不方便”。您的控制台方法不是 OP 所要求的,并明确解释了为什么需要 Start-Process 解决方案。因此,那些正在寻找不是基于Start-Process 的解决方案的人不会去看那里,愿意回答的人也不太可能发帖。

标签: powershell docker containers


【解决方案1】:

不需要参数飞溅甚至调用运算符,双引号解决:

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

【讨论】:

  • 对于 cwd/pwd:... -v "$($pwd.path -replace '\\','/'):/data ..." — 在官方文档中,只有 linux 版本(略微编辑以适应这种情况)...-v "$(pwd)":/data... — 参见 docs.docker.com/storage/bind-mounts/…