SSH 已登入遠端 Mac,但 CI 執行 Docker 命令時仍回報無法連線。
最快的排查順序:先確認 Docker Desktop 正在執行任務的 macOS 帳戶下運作,再核對該帳戶實際使用的 Docker CLI、Docker context 與 socket。SSH 登入成功或 CLI 已安裝,都不能單獨證明 Docker Engine 可用。
適合維護 Xcode 與容器建置共用節點、需要定位 Engine 連線故障的 CI 工程師。
適合透過 SSH 操作遠端 Mac,並需要分清主機連線與 Docker 服務狀態的開發者。
也適合負責節點准入、帳戶權限及重啟復原驗收的 DevOps 工程師。
[ SECTION_01 ] Docker Desktop 遠端 Mac CI 連線失敗:先分清故障層
這條鏈路可拆成三個檢查點:SSH 是否登入目標主機、Docker CLI 是否由預期路徑執行、CLI 是否連上可用的 Docker Engine。故障位於不同層時,修復方向也不同;只測試 SSH 或 docker --version,無法證明容器建置已具備執行條件。
| 現象 | 優先檢查 | 可留下的證據 | 暫時不要做的事 |
|---|---|---|---|
SSH 成功,提示找不到 docker |
執行帳戶、Shell、PATH 與 CLI 位置 |
id -un、command -v docker、版本輸出 |
直接重裝 Docker Desktop |
| CLI 有回應,Engine 連線失敗 | Desktop 狀態、context、連線端點 | context 名稱、端點資訊、連線錯誤全文 | 只憑常見 socket 路徑判定正常 |
| Engine 可用,建置仍失敗 | 登入憑證、映像檔拉取、網路及專案日誌 | CI 工作日誌、命令結束狀態 | 反覆更改主機連線設定 |
Docker 官方將 Mac 安裝、Desktop 管理與 Engine 連線問題分別說明;可先參考macOS 安裝與系統需求說明及Docker Desktop 一般疑難排解 FAQ。系統支援範圍會隨版本更新,應以當下官方文件與實際安裝版本為準。
[ SECTION_02 ] SSH 登入後 Docker 命令為何仍連不上引擎?
先確認 SSH 工作階段實際使用的帳戶與 Shell,而不是假設它和互動式桌面工作階段相同。在目標主機執行:
id -un
printf '%s\n' "$SHELL"
printf '%s\n' "$PATH"
command -v docker
docker --version
docker version
command -v docker 用來確認目前 Shell 找到的執行檔位置;docker --version 顯示 CLI 版本資訊,但不能據此認定 Engine 已連通。docker version 則應與連線錯誤一併檢查:若只有用戶端資訊,或命令回報無法連上 daemon,應繼續檢查 Desktop 狀態和連線目標。Docker 官方提供Desktop CLI 管理方式,可用來核對目前版本支援的管理命令。
接著,在同一個帳戶與 Shell 中確認 Docker Desktop 是否已啟動。若桌面互動工作階段能用,但 SSH 工作階段不能用,應先查明兩者是否使用相同帳戶、環境變數與 CLI 路徑。不要把 CLI 未安裝、Shell 沒載入預期路徑,以及 Desktop 尚未運行當成同一種故障。
執行環境可以用以下方式留下對照資料:
id -un
command -v docker
env | grep '^DOCKER_'
docker context ls
docker context show
CI 工作本身也應記錄相同資訊。人工 SSH 測試與 CI job 的輸出分開保存,才看得出差異來自帳戶、環境變數或執行路徑。
[ SECTION_03 ] Docker Desktop 已啟動但 CI 仍無法連線 daemon:檢查 context 與 socket
Desktop 顯示已啟動,不代表目前 CLI 一定指向它。先確認 Docker context,再查該 context 記錄的連線端點。Docker 官方的 docker context 參考文件說明 context 管理方式;docker context use 文件則說明如何切換目前使用的 context。
docker context ls
docker context show
docker context inspect "$CTX"
docker info
請把 $CTX 換成檢查所得的 context 名稱。核對 docker context inspect 顯示的端點與目前執行方式是否相符,再確認環境中是否有 DOCKER_HOST、DOCKER_CONTEXT 等設定影響目標選擇。若錯誤訊息指出 socket 或端點無法連線,先查明該位址由哪一個帳戶、Desktop 狀態或 context 提供;不要因為某個常見路徑存在,就推定 Engine 已可用。
| 核對項目 | 正常證據 | 異常時的下一步 |
|---|---|---|
| Desktop 狀態 | 目標帳戶下可確認 Desktop 正在運作 | 用該帳戶啟動或檢查 Desktop,再重試 |
| Docker context | 名稱和連線端點符合預期 | 排除環境變數覆寫,核對 context 設定 |
| Engine 連線 | docker info 能取得伺服器端資料 |
保留完整錯誤,回查端點和 socket 權限 |
| CI 任務 | 目標帳戶可完成最小容器任務 | 依失敗階段查登入、拉取、網路或建置 |
若需要調整 Desktop 設定,先查閱官方的設定與維護說明,並依照目前安裝版本確認可用選項。不要把其他作業系統或不同 Desktop 版本的設定步驟直接套用到遠端 Mac。
[ SECTION_04 ] 更換 CI 執行帳戶後 Docker Desktop 為何不可用?
macOS SSH 的登入帳戶、互動式終端帳戶、CI job 帳戶與背景工作帳戶可能並不相同。切換帳戶後,Desktop 狀態、使用者層級的 CLI 路徑、context 與環境變數都需要重新核對;不能假定另一個帳戶會沿用原本工作階段的設定。
在人工 SSH 工作階段與 CI job 中分別執行前述檢查,對照 id -un、command -v docker、docker context show 和 docker info 的結果。若其中一項不同,先找出差異,再決定是否調整 CI 的登入方式、環境變數或任務設定。不要為了讓命令通過而直接擴大帳戶權限,尤其是尚未查清 socket 存取範圍時。
注意:若 Desktop 是在某個使用者工作階段中啟動,不能未經驗證就推定其他帳戶或背景工作也能使用相同 Engine。請以實際 CI 帳戶執行容器任務作為依據。
[ SECTION_05 ] Engine 已連線,建置仍失敗的責任邊界
當 docker info 已取得伺服器端資料,故障便不一定還在主機連線層。接下來應按任務階段看日誌:映像檔拉取失敗時,先查倉庫認證與網路存取;映像檔已取得但建置中斷時,檢查專案日誌、容器內依賴及目標架構;容器啟動後才出錯,則聚焦應用程式輸出。
這個分界能避免把倉庫登入失敗誤診為 socket 問題,也能避免因容器內依賴錯誤而反覆更改 Docker context。若故障只在 CI 發生,對照 CI 環境變數、憑證可用狀態與實際建置命令;若人工與 CI 都失敗,再回頭核對主機端 Engine 連線。
[ SECTION_06 ] 重啟復原與遠端 Mac 節點准入
修復連線後,不應只以一次互動式終端成功作為上線證明。使用目標 CI 帳戶執行最小容器任務,保存執行帳戶、Docker context、連線端點、日誌與命令結束狀態。接著在可控維護時段重啟,再以同一帳戶重做檢查。Docker 官方版本發布說明可協助核對目前版本的變更;版本升級後,也應重新跑相同驗收。
落地時可按以下順序操作:
- 記錄 CI job 實際執行帳戶、Shell 與
PATH,與人工 SSH 工作階段做對照。 - 確認該帳戶可找到預期的 Docker CLI,並保存
docker --version和docker version輸出。 - 核對 Desktop 的運行狀態,避免只根據安裝完成或圖形介面曾經開啟作判斷。
- 檢查目前 Docker context、端點與
DOCKER_環境變數,記錄當次 CI 實際使用的連線目標。 - 用 CI 帳戶執行最小容器任務,確認 Engine 連線、映像檔取得及專案建置各自結果。
- 在受控重啟後重做以上檢查,保留錯誤訊息、日誌與復原結果。
- 依照證據決定節點可正式承載容器工作、僅限互動式使用,或暫不納入 CI。
節點准入的條件判斷
- 若目標 CI 帳戶能找到預期 CLI、連上正確 Engine,並在受控重啟後再次完成實際任務,則可考慮讓節點承載已驗證的容器工作。
- 若只有人工 SSH 工作階段成功,或重啟後需手動登入才能恢復,則先限制用途,不要宣稱適合無人值守任務。
- 若Engine 連線正常但專案任務失敗,則保留主機連線設定,轉查倉庫認證、網路、映像檔架構與容器內建置日誌。
- 若帳戶、context 或 socket 的責任邊界仍不清楚,則暫緩節點准入,先補足同一 CI 帳戶的可重現證據。
如果目前方案依賴某位工程師的互動式桌面工作階段、手動啟動 Desktop,或未經驗證的重啟流程,這些都會增加值班交接與故障復原的不確定性。若團隊需要可按需使用的 macOS 建置環境,可先了解遠端 Mac 開發環境選項,再依照實際 Docker 任務驗收帳戶、context、socket 與重啟結果;NOVAKVM 遠端 Mac 租用適合需要臨時或階段性 macOS CI 環境的情況。若工作負載長期穩定且持續繁重,可先參考Mac mini M4 買斷或租用的成本判斷;若必須直接使用本機實體介面,購置自有 Mac 可能更合適。不論選擇哪種方式,都應先用真實流水線驗證,而不是把 SSH 成功當成 Docker Engine 可用。