1. 程式人生 > >pycharm 遠端除錯docker 中的Python指令碼

pycharm 遠端除錯docker 中的Python指令碼

一、遠端伺服器以及docker配置ssh

1 原理

將docker中的ssh埠22對映到伺服器中的某一個埠,例如9999,本地使用docker的使用者名稱和密碼登入9999埠,也就登入了相應的docker

2 ssh配置步驟

  • 執行docker映象,並且指定相應的埠對映關係
NV_GPU=5 nvidia-docker run -ti --name my_tensorflow1.9_py3 -v ~/dataShare:/home/dataShare -p 9999:22 192.168.12.23:5000/tensorflow1.4:18.01-py2 /bin/bash

這裡指定了容器執行後,將容器的埠22對映到伺服器的埠9999。

  • 在遠端伺服器以及daocker中分別安裝ssh服務,openssh-server
sudo apt-get install openssh-server
  • 在docker中配置ssh服務
#允許使用root身份登入docker
sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
sed '[email protected]\s*required\s*[email protected] optional [email protected]' -i /etc/pam.d/sshd

#下面這一步可能沒有許可權,可以自己開啟相應的檔案,將"export VISIBLE=now"寫入/etc/profile的最後一行
echo "export VISIBLE=now" >> /etc/profile
  • 重啟ssh服務
service ssh restart
  • 在伺服器中測試埠對映
#檢視自己的docker container埠22所對映的伺服器埠
docker port my_tensorflow1.9_py3 22

#如果對映成功,可以看到如下輸出
0.0.0.0:9999
  • 在本地測試ssh登入docker container
#如果本地是windows,可以下載git,使用git bash測試
ssh <username>@<server IP> -p 9999

如果上面的ssh配置失敗,可以檢視防火牆是否禁用了相應埠。

3 本地pycharm配置

  • 選擇Tools->Deployment->Configuration,增加SFTP伺服器
    在這裡插入圖片描述

  • 點選左上角加號,輸入server name,以及選擇Type為SFTP
    在這裡插入圖片描述

  • 按照自己伺服器地址、對映埠、docker使用者名稱密碼進行相應設定
    在這裡插入圖片描述

  • 選擇Mapping選項卡,配置本地、遠端,對應專案路徑的對映
    在這裡插入圖片描述

  • 配置遠端專案以及本地專案的同步
    選擇Tools->Deployment->Automatic Upload(always)
    這樣就可以隨時使用ctrl+s來進行本地專案修改和遠端docker中專案的自動同步

  • 配置遠端編譯器
    File->Settings->Project:your project name->Project Interpreter
    在這裡插入圖片描述

選擇Add Interpreter
選擇SSH Interpreter,右邊視窗選擇Existing server configuration,選擇已經配置好的遠端伺服器即可。接下來會有兩個選項Create和Move,選擇Move即可
在這裡插入圖片描述

  • 對映本地專案路徑和對應的伺服器專案路徑
    在這裡插入圖片描述

  • 到這一步幾乎已經完成了遠端除錯docker的所有配置,但是如果你現在就開始甩開鍵盤慶祝的話,就有點早了。執行基於GPU的TensorFlow專案時,會出現錯誤 ImportError:libcuda.so.1: cannot open shared object file: No such file or directory
    在這裡插入圖片描述

    • 解決辦法
      選擇Run->Edit Configurations->點選加號->選擇python->找到專案執行主檔案增加環境變數LD_LIBRARY_PATH=/usr/local/cuda/lib64。這裡要檢視自己docker中對應的路徑,使用命令如下:
echo $LD_LIBRARY_PATH

然後設定相應的路徑即可