v0.11.0

Compose 改寫

最後更新

本頁說明 PodRun 如何在遠端產生 docker-compose.podrun.yml,讓同一份 compose 檔不經修改就能在遠端 Podman 執行。

為何要副本

本地的 docker-compose.yml 通常綁定主機 Port(8080:80),在共用的遠端主機上容易衝突;相對路徑 Volume 在啟用 SELinux 的主機上也需要 :z 標籤。PodRun 只改遠端副本,本地檔案保持原樣。

步驟

步驟 動作
1 在遠端依序尋找 docker-compose.yml、docker-compose.yaml,都沒有則回傳錯誤
2 複製為 docker-compose.podrun.yml
3 以三條 sed 移除主機 Port
4 以 awk 為 ./ 開頭的 Volume 補上 :z

Port 移除規則

原始寫法 改寫後
"8080:80" "80"
${WEB_PORT}:80 80
${WEB_PORT:?error}:80 80

移除主機 Port 後,Podman 會為容器 Port 指派隨機主機 Port;up -d 結束時印出的 podman ps 表格即為實際對應。

Volume 規則

原始寫法 改寫後
- ./data:/data - ./data:/data:z
- ./data:/data:ro 預期 - ./data:/data:ro,z;實作以 gsub 搭配 \1 反向參照,POSIX awk 的 gsub 不支援反向參照,實際輸出未驗證
- ./data:/data:ro,z 不變

只處理 ./ 開頭的相對路徑 Volume;具名 Volume 與絕對路徑不變。規則使用 \s,遠端的 awk 需支援此寫法(如 gawk);macOS 內建 awk 不支援,規則不會命中。

執行

up 會先以 podman compose -f docker-compose.podrun.yml down -v 清掉舊容器,再以同一個檔案執行你的指令,例如 up -d。clear 也使用這份副本。

轉送指令(down、ps、logs 等)目前在遠端目錄執行 podman compose <args>,未帶 -f docker-compose.podrun.yml。

EN