星路

追寻那一缕星光,在漆黑夜晚前行

0%

Visual Studio Code调试Home Assistant代码(Docker版)

上次使用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.方法简介 ## Docker容器环境开发调试,需要一台Linux主机提供容器,本地Windows使用VS Code远程到容器环境运行代码。与使用WSL开发调试相比,有一个好处就是代码在Linux主机上,可以在不同的终端主机通过VS Code远程登录开发调试。不过缺点就是本地代码是没法直接和远程环境同步,不像WSL所加载的代码目录在Windows上是可以直接访问修改的。 使用Docker容器环境开发调试,可以根据项目工程的`devcontainer.json`文件实现镜像构建、插件安装、运行参数设定等一系列过程实现自动部署容器开发环境;也可以将代码加载到已有的容器中去运行。前一种由于本人理解有限加上上手较难,有兴趣可以观看[VS Code文档][2]结合HA代码工程(Github上的项目带有配置文件)实践部署。这里只介绍后一种方法,目标是以最简单的方法实现调试Home Assistant代码。 *** ## 2.准备 ## ### 2.1.Linux ### Linux下docker安装过程省略。 - 开启Docker开启远程访问。
1
vi /lib/systemd/system/docker.service
1
2
3
4
# /lib/systemd/system/docker.service 文件
# 修改ExecStart行
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
#

2375端口

这里的端口号不是自定义端口,只能用2375或2376,另外2375是不加密不验证的端口,有安全方面的要求请启用2376端口并进行相应设置,具体方法自行搜索。

- 调大用户监视文件数,详细说明可以看[这里][3]。 - 编辑配置文件
1
vi /etc/sysctl.conf
1
2
3
# /etc/sysctl.conf 文件
# 末尾加入
fs.inotify.max_user_watches = 81920

说明

默认数值是8192,最大是524,288。

容器的参数和宿主机一致,只能在宿主机修改。

  • 使能配置。

    1
    sysctl -p
  • 创建测试环境容器,用使用官方的镜像即可,根据需要调整版本号。

    1
    2
    docker 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"

    端口映射

    也可以不设置端口映射,VS Code提供Remote-Containers: Forward Port from Container功能,分配到端口后可以在Windows通过localhost:[转发端口]访问。

    ### 2.2.Windows ### windows下只要安装Docker Desktop即可。

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
      5
      from 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部署更方便。