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。