如何解決 PyCharm Pro 2023.2 執行遠端主機中容器內的 Python 找不到檔案的問題?

一般在使用 Docker 容器開發程式的時候,大部分是在自己的電腦上透過 Docker Desktop 產生 Container,但是如果手上只有弱弱的筆電,沒辦法跑那種很吃效能的程式,那就只能在 Server 上直接用 Docker 開發程式。

Generate by Midjourney niji 5

照著 PyCharm 的 UI 引導設定 New Interpreter > Docker 的時候, SSH 遠端主機的 Docker Container 會有路徑映射的問題:

這其實要分成三個問題解釋:

  1. 筆電的 code 要上傳到遠端主機上的哪裡? -> SFTP
  2. 上傳的檔案怎麼放進容器? -> Mount Volume
  3. 容器內的 Python 怎麼知道執行路徑? -> Path Mapping

1. 筆電的 code 要上傳到遠端主機的哪裡? -> SFTP

Settings > Deployment > SFTP 建立檔案上傳

Connect 分頁選擇要連接 SSH 的主機,如果沒有適合的選項按右邊 建立

Mappings 分頁的 Deployment path 選擇主機上的上傳路徑

設定好路徑後記得將它打勾選為 Project 預設(預設會變粗體)

Options 內設定自動上傳,這樣每次執行前就會自動上傳目前的 code 到主機上


2. 上傳的檔案怎麼放進 Container? -> Mount Volume

Run > Edit Configurations 裡面選 Edit configuration templates… 建立模板,這樣就不用每個程式都要單獨設定。

選擇 Python 內的 Docker container settings 中的資料夾圖示

因為原本的 Volume bindings 有 bug 要全部刪掉,改成自己寫 docker run 的指令到 Run options 內:

--rm 是執行結束自動移除容器
-v /home/jimmy/DAS:/app 是將路徑掛載到容器內,格式為 -v 遠端主機路徑:容器內路徑,容器內路徑可以自訂,只要與外面 Path Mapping 的位置一致就可以了。


3. Container 內的 Python 怎麼知道執行路徑? -> Path Mapping

回到剛剛 Edit configuration templatesPython 頁面,選取 Path mappings 旁邊的資料夾圖示。

+ 新增一個路徑映射,Local path 設定成筆電內 Project 的資料夾Remote path 設定成容器內資料夾

回到上一層將 Working directory 設定成筆電內 Project 的資料夾


總結

Settings > Deployment > Mappings > Deployment path: 遠端主機資料夾

Run > Edit Configurations > Edit configuration templates.. > Python

Working directory: 筆電內 Project 的資料夾
Path mappings: 筆電內 Project 的資料夾 = 容器內資料夾
Docker container settings: –rm -v 遠端主機資料夾:容器內資料夾

這樣就可以執行遠端容器內的程式了


已知問題

目前使用這個方式沒辦法使用 debugger,初步推測為 container 沒有辦法連接 port 出來,有可能未來 PyCharm 更新會解決這個問題


發表迴響