这个Wing技巧描述了如何配置Docker Compose,以便用Wing Pro调试运行在选定容器服务上的Python代码。这使得开发和调试用Python编写的容器化应用程序变得容易。
Wing Pro 8增加了对使用Docker Compose进行Python开发所涉及的更多设置的支持,使其自动化。这一点目前可以通过我们的早期访问获得。
先决条件
要开始工作,你需要安装Docker Compose。
你还需要一个现有的Docker Compose项目,该项目至少在一个容器服务中使用Python。如果你还没有,那么按照《Docker Compose入门》中的描述,建立一个Docker Compose项目是很容易的。 但是,如果你使用那个例子,你需要换成官方的Python docker镜像,而不是 "alpine "镜像,后者包含一个被剥离的Python构建,不能加载Wing的调试器核心。这很容易做到,只要在Docker文件中把FROMpython:3.7-alpine改为FROM:python:3.8即可。 你还需要从Docker文件中删除RUN apk add一行。 官方的Python docker镜像不需要这样做。
配置
为了设置你的Docker Compose项目,使其能够与Wing的Python调试器一起使用,你需要给每个你想调试的容器添加一些卷挂载。 这些挂载Wing的调试器支持,使Python在容器上运行时启动调试。
1.准备sitecustomize
第一步是在你的docker-compose.yml文件的同一目录下建立一个新的目录sitecustomize,然后在该目录下添加一个名为__init__.py的文件,内容如下。
这是一个钩子,将使容器上的Python加载Wing的调试器。 它由Python的Site-specific配置钩子加载。
2.配置 wingdbstub.py
接下来,你需要配置wingdbstub.py的副本,将其放入这个sitecustomize目录。这个模块是由Wing提供的,作为从IDE之外启动任何Python代码的调试方式,这里的情况就是如此,因为你的代码是通过docker-compose在容器中启动 的 。
你可以在Wing安装的顶层找到wingdbstub.py的主副本(或者在macOS上,在WingPro.app内的目录/资源中)。如果你不知道这是哪里,它被列为Wing的 "关于 "框中的安装 目录。
你将需要把这个文件复制到你的sitecustomize包目录,然后对它做两个修改。
- 设置WINGHOME='/wingpro7
- 设置kHostPort='host.docker.internal:50005' 。
3.检查你的安装
为了弄清你需要在docker-compose.yml文件中添加哪些卷挂载,你首先需要确定。
(1) 你在主机系统上的Wing安装的完整路径,这在Wing的 "关于 "框中给出。这与你之前找到wingdbstub.py的地方相同。
(2) 你想调试的每个容器上的网站定制网站包的位置。这是你将从主机系统挂载sitecustomize目录的地方。你可以通过在容器上启动 Python 并检查它来确定这个值。例如,对于docker-compose.yml中名为web的服务,你可以像这样在容器上交互地启动Python。
docker run -i compose_web python -i -u
注意,Docker镜像的名称与Docker Compose服务的名称相同,但前缀为compose_。
然后输入或粘贴以下几行代码。
记下这个打印的路径;在下面的步骤中你会需要它。
4.添加挂载的卷
现在你可以在docker-compose.yml文件中添加你的卷挂载。你将在/wingpro7挂载Wing安装目录(这必须与你的wingdbstub.py副本中早先设置的WINGHOME相匹配),并在上述确定的site -packages内挂载你的sitecustomize包目录。
例如,在Windows上,你可以在docker-compose.yml中为你想调试的每个服务添加以下内容。
volumes:
- "C:\Program Files (x86)\Wing Pro 7.2:/wingpro7"
- "./sitecustomize:/root/.local/lib/python3.8/site-packages/sitecustomize"
在macOS上可能是这样的。
volumes:
- /Applications/WingPro.app/Contents/Resources:/wingpro7
- ./sitecustomize:/root/.local/lib/python3.8/site-packages/sitecustomize
而在Linux上可能是这样。
volumes:
- /usr/lib/wingpro7:/wingpro7
- ./sitecustomize:/root/.local/lib/python3.8/site-packages/sitecustomize
例子
下面是在Docker Compose入门中使用的docker-compose.yml中,在上下文中添加这些卷的例子。
version: "3.8"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- ./sitecustomize:/root/.local/lib/python3.8/site-packages/sitecustomize
- /Applications/WingPro.app/Contents/Resources:/wingpro7
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"
注意,我们只是在调试Web服务,而不是在Redis服务上运行的Python代码。
开始调试
现在你可以启动你的集群并在Wing Pro中调试你的容器化Python代码。
要做到这一点,首先要确保Wing正在监听外部的调试连接,方法是点击Wing窗口左下角的错误图标 ,并启用接受 调试连接。
如果你使用的是《Docker Compose入门》中的Flask例子(或任何你希望调试的产生多个进程的代码),那么你还需要从项目菜单中打开项目 属性,将Debug /Execute标签下的Debug 子 进程设置为总是 调试 子 进程。
然后用docker-compose 启动 你的集群。你的应用程序将启动,你为调试配置的容器应该尝试连接到Wing Pro。Wing最初会拒绝该连接,并为你试图调试的每个容器显示一个对话框。
点击接受,然后按Ctrl-C停止docker-compose , 并重新启动它。当你第二次启动你的集群时,容器应该能够成功连接到Wing的调试器,因为你已经接受了每个容器使用的随机生成的安全令牌。
现在你可以在调试过程中使用堆栈 数据、调试 控制台和Wing中的其他工具来设置断点、逐步通过代码、查看数据并与之互动。 关于Wing的功能的更多信息,请看Wing的帮助菜单中的教程,或者看一下快速入门指南。
故障排除
如果你不能让调试器连接,尝试在你的wingdbstub.py副本中设置kLogFile为""。这将把调试器的诊断记录到docker-compose 的 输出中,并将指出调试器是无法加载还是无法连接到IDE。你可以把这个输出发送到support@wingware.com,寻求帮助。
要检查其他问题,包括你添加的文件挂载是否正常工作,你可以在docker-compose up之后用docker-compose 在选定的Docker容器中启动一个shell。例如,为docker-compose.yml中定义的服务web启动一个交互式shell。
docker-compose web bash
未来的方向
我们在Wing Pro 8中的部分重点是扩展和改进Wing对容器化开发的支持。这包括自动化的容器和集群配置。截至本文发布之日,该功能的一个子集,用于处理单个容器,在我们的早期访问计划中可用。未来的版本将扩展这一功能,以支持Docker Compose,也可能支持其他容器编排系统。如果你有关于支持容器化开发的特定类型的要求,请给我们发电子邮件。
这就是目前的情况!我们将很快回来,为Wing Python IDE提供更多的Wing技巧。
像往常一样,如果你遇到问题,有任何疑问,或者对未来的Wing技巧有主题建议,请不要犹豫,发邮件到 support@wingware.com!