Port forwarding on Windows

最近因為 Docker Desktop on Windows 的許可證關係導致需要找替代品,目前覺得還堪用的就是 Podman 了,因此就開始了轉換之路。

目前 Podman 已經越來越完善了,所以基本上算是無痛轉移,除了 port 轉發這件事情,不知道為啥沒有處理,所以研究了一下如何使用 Windows 內建的工具 Netsh 來達到轉發的功能。

基本上只要使用以下指令就可以達到效果,還蠻簡單的:

netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=127.0.0.1

不過中間遇到了一些問題,因為網路上找了不少資料 connectaddress 的值都是填寫 podman 的 wsl 的 IP,但不知道為啥我使用後都沒效果,後來看到有些人說直接填 127.0.0.1 即可,試了一下果然就通了。

另外 netsh 的指令需要使用管理者權限才可以執行。

以下提供一個直接抓取所有 container port 然後設定所有 port 轉發的 PowerShell script:


# This script is used to forward ports from Windows to WSL2

# Usage:
# 1. Open PowerShell as an administrator
# 2. Run the following command:
#    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# 3. Run the following command:
#    .\port-forwarding.ps1 [-TargetAddress your.connect.ip.address]
# 4. Run the following command to check the port forwarding:
#    netsh interface portproxy show v4tov4 all

param (
    [string]$TargetAddress
)

# Check if the script is running as an administrator
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host "This script requires administrator privileges. Please run the script as an administrator."
    Exit 1
}

# Check if the $TargetAddress parameter is provided
if (-not $TargetAddress) {
    $TargetAddress = $(wsl hostname -I)
}

$ports = podman ps -a --format "table {{.Ports}}" | ForEach-Object { $_.Split(':')[1]?.Split('-')?[0] }
foreach ($port in $ports) {
    if($port -eq $null) {
        continue
    }
    
    $command = "netsh interface portproxy add v4tov4 listenport=$port listenaddress=0.0.0.0 connectport=$port connectaddress=$TargetAddress"
    Invoke-Expression $command
    Write-Host "netsh port: $($port)"
}

netsh interface portproxy show v4tov4 all

參考:

Read more

Debug Story

Debug Story

Ref: * 寫程式不是輸出,是內化 * Vibe Story:用敘事智能為程式碼注入生命,簡化維護 這篇主要是想紀錄一下看了Ruddy 老師的文章後想做的事情,雖然通篇的重點不是在我想做的這件事,但因為Ruddy 老師的這篇文章讓我覺得以後在排除 Bug 的時候應該要做這件事才對。 以下的內容是擷取 Ruddy 老師的內容(部分修改) 1. 記錄搜尋路徑與嘗試過的假設 => 我以為是 state 沒清,但發現是 effect 未執行 2. 為錯誤進行分類,然後標註成概念 => 這是 mutable state 的副作用問題 3. 寫一段描述該段程式的情境與原則 => Vibe Story 該段程式的情境與原則可以參考一下的要點撰寫: * 場景(Context):描述程式碼的背景與需求。 * 目標(Goal):說明功能目的。 * 挑戰與迭代(Challenges &

By Mars
Claude Code Status line on Windows

Claude Code Status line on Windows

Claude Code 在大家軍備戰發布了 Status line 這個功能,讓使用者可以在 Claude Code 的輸入框下方自訂自己想要的訊息,官方提供幾個方式可以實現這功能(Bash, Node.js, Python),最後我選擇使用 Node.js。 趁著週末寫玩了一下,剛開始照著官方文件做,結果啥都沒顯示出來,接著叫 Claude Code 幫我做,他說成功了,結果還是啥都沒有...最後才發現可能是官方提供設定檔案的問題 { "statusLine": { "type": "command", "command": "~/.claude/statusline.sh", "padding": 0 // Optional:

By Mars