我正在将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]}
答案 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
}
请注意,如果没有${}
语法,冒号将被视为驱动器/作用域修饰符。
答案 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>