需要帮助来结合两个Powershell命令以在Docker中自动进行端口转发(在vmware上)

时间:2018-09-26 14:53:37

标签: powershell docker vmware

我正在将Docker与Vmware工作站和dockermachine一起使用。 (不是默认的超级v)

Docker工作得很好,但是我需要手动告诉系统 进行从容器到Docker主机的端口转发。

我可以在此行中做到

ssh docker@$(docker-machine ip dev) -f -N -L 5006:localhost:5006  

效果很好。

现在我正在运行许多容器,并且它们经常更改,因此键入 每次都很耗时,应该自动化。

使用docker ps可以获得容器及其端口映射的列表。 使用powershell对其进行清理

docker ps --format "{{.Ports}}"|ForEach-Object{($PSItem -split ":|-")[1]}

我得到了端口列表

5023
5210
5205
5303
5006
5105
5016

这很好。

我不知道如何处理在Powershell中生成的此列表 并编写一个神奇的Powershell咒语来执行命令

ssh docker@$(docker-machine ip dev) -f -N -L $PORT:localhost:$PORT

对于我从中获得的列表中的每个端口号

docker ps --format "{{.Ports}}"|ForEach-Object{($PSItem -split ":|-")[1]}

2 个答案:

答案 0 :(得分:1)

您要寻找的是一个foreach循环:

$list = & docker ps --format '{{.Ports}}' | ForEach-Object { ($PSItem -split ':|-')[1] }
foreach ($port in $list)
{
    & ssh docker@$(& docker-machine ip dev) -f -N -L ${port}:localhost:$port
}

请注意,如果没有${}语法,冒号将被视为驱动器/作用域修饰符。


about_Foreach

about_Operators

about_Variables

答案 1 :(得分:0)

如果端口的输出只是一个字符串:

$portList = docker ps --format "{{.Ports}}"|ForEach-Object{($PSItem -split ":|-")[1]}
[Array]$portListParsed = $portList.Split(' ')
foreach($port in $portListParsed)
{
     Invoke-Command -Command $(ssh docker@$(docker-machine ip dev) -f -N -L $port:localhost:$port)
}

我不确定帖子中带有$ PORT:localhost:$ PORT的docker语法,但是如果第一个变量具有常量,则可以将其设置为单独的变量并将其切换出。 / p>