上次使用VS Code在WSL下实现了Home Assistant代码的调试,对Visual Studio Code的远程调试功能有了一定的了解,现在再回头看一开始就折腾的Docker远程调试,很多问题迎刃而解。
0.环境
- Win10 + Docker Desktop 2.1.0.1
- Ubuntu 18.04 + Docker CE 19.03.1
- Visual Studio Code 1.38.0
windows环境
Windows需要Docker Desktop相关的工具提供支持。
1 | vi /lib/systemd/system/docker.service |
1 | # /lib/systemd/system/docker.service 文件 |
2375端口
这里的端口号不是自定义端口,只能用2375或2376,另外2375是不加密不验证的端口,有安全方面的要求请启用2376端口并进行相应设置,具体方法自行搜索。
1 | vi /etc/sysctl.conf |
1 | # /etc/sysctl.conf 文件 |
说明
默认数值是8192,最大是524,288。
容器的参数和宿主机一致,只能在宿主机修改。
使能配置。
1
sysctl -p
创建测试环境容器,用使用官方的镜像即可,根据需要调整版本号。
1
2docker pull homeassistant/home-assistant:0.98.0
docker run -it --name demo -p 8456:8123 homeassistant/home-assistant:0.98.0 /bin/sh -c "while sleep 1000; do :; done"### 2.2.Windows ### windows下只要安装Docker Desktop即可。端口映射
也可以不设置端口映射,VS Code提供Remote-Containers: Forward Port from Container功能,分配到端口后可以在Windows通过
localhost:[转发端口]
访问。
3.VS Code操作
VS Code安装Docker插件、RemoteDevelopment插件。
配置docker连接信息。
连接容器,将会新建远程窗口,有两种方法。
- 方法1:远程资源管理器中,选择容器->”Connect to Container”
- 方法2:Docker插件中,容器窗->容器右键->”Attach Visual Studio Code”
- 新窗口成功连接容器(左下角有变化)
在容器中安装Python插件,代码调试需要。
准备代码目录。
- 打开主目录,因为官方镜像中程序代码位于
/usr/src/homeassistant/homeassistant
,可以直接使用/usr/src/homeassistant
作为主目录而无需新建。 - 保留
homeassitant
文件夹,删除其它非必要文件(可选)。 - 新建
config
目录,作为HA配置目录。Tips
在VS Code的文件资源管理中直接编辑即可,也支持拖拽上传下载。
- 新建
debug.py
,用于启动HA,内容如下:1
2
3
4
5from homeassistant import __main__ as hass_entry
import sys
if __name__ == "__main__":
sys.exit(hass_entry.main()) - 新建
.vscode
目录,.vscode
目录下新建launch.json
文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17//launch.json内容
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Home Assistant Debug",
"type": "python",
"request": "launch",
"program": "${workspaceRoot}/debug.py", //运行HA
"console": "integratedTerminal",
"args": ["-c", "config"], //指定配置文件
}
]
} - 最终目录结构如图。
- 打开主目录,因为官方镜像中程序代码位于
4.调试
在远程窗口(连接到容器)下,菜单栏->调试->启动调试(快捷键F5)开始运行调试。如下图,可以看到能够正常追踪HA主程序断点以及自定义组件代码断点。
- 启动过程断点
- 正常运行自定义插件断点
- 网页调用服务触发断点
5.其它
修改过的代码应及时备份到本地,以免删除容器丢失代码,也可以根据VS Code文档指引自动同步至本地。
避免在断点停下来时候直接结束调试,这样进程不会退出无法释放端口,需要手工终止进程。
1
2
3# VS Code新建终端
ps -aux | grep python | grep config
kill -9 [进程号]
6.小结
- 远程调试不需要本地安装python运行环境,代码解析由远端的python运行;远程调试模式下远端会安装有VS Code服务程序,本地VS Code作为操作界面实现交互。
- 得益于官方HA镜像的主程序代码没有在python安装目录,不需要另外下载代码包。另外不同版本的代码文件可以直接docker pull下来,初步使用下来比用WSL部署更方便。