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
    INFO:Windows需要Docker Desktop相关的工具提供支持。

1.方法简介

Docker容器环境开发调试,需要一台Linux主机提供容器,本地Windows使用VS Code远程到容器环境运行代码。与使用WSL开发调试相比,有一个好处就是代码在Linux主机上,可以在不同的终端主机通过VS Code远程登录开发调试。不过缺点就是本地代码是没法直接和远程环境同步,不像WSL所加载的代码目录在Windows上是可以直接访问修改的。
使用Docker容器环境开发调试,可以根据项目工程的devcontainer.json文件实现镜像构建、插件安装、运行参数设定等一系列过程实现自动部署容器开发环境;也可以将代码加载到已有的容器中去运行。前一种由于本人理解有限加上上手较难,有兴趣可以观看VS Code文档结合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
    #

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

  • 调大用户监视文件数,详细说明可以看这里

    • 编辑配置文件

      1
      vi /etc/sysctl.conf
      1
      2
      3
      # /etc/sysctl.conf 文件
      # 末尾加入
      fs.inotify.max_user_watches = 81920

      INFO:默认数值是8192,最大是524,288。
      INFO:容器的参数和宿主机一致,只能在宿主机修改。

    • 使能配置。

      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"

    INFO:也可以不设置端口映射,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配置目录。
      INFO: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部署更方便。