# 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`。
