docker - 如何在 docker 中调试 odoo?
问题描述
我无法在 docker 容器中调试 odoo。
我正在使用 Visual Studio Code,并且我有以下 launch.json 配置。
{
"version": "0.2.0",
"configurations": [
{
"name": "Odoo 12",
"type": "python",
"request": "launch",
"stopOnEntry": false,
"pythonPath": "${config:python.pythonPath}",
"program": "/usr/bin/odoo",
"args": [
"--config=/etc/odoo/odoo.conf"
]
}
]
}
每次我启动调试器时,都会发生此错误:
Exception in thread odoo.service.httpd:
Traceback (most recent call last):
File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
self.run()
File "/usr/lib/python3.5/threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "/usr/lib/python3/dist-packages/odoo/service/server.py", line 410, in http_thread
self.httpd = ThreadedWSGIServerReloadable(self.interface, self.port, app)
File "/usr/lib/python3/dist-packages/odoo/service/server.py", line 136, in __init__
handler=RequestHandler)
File "/usr/lib/python3/dist-packages/werkzeug/serving.py", line 476, in __init__
HTTPServer.__init__(self, (host, int(port)), handler)
File "/usr/lib/python3.5/socketserver.py", line 440, in __init__
self.server_bind()
File "/usr/lib/python3/dist-packages/odoo/service/server.py", line 151, in server_bind
super(ThreadedWSGIServerReloadable, self).server_bind()
File "/usr/lib/python3.5/http/server.py", line 138, in server_bind
socketserver.TCPServer.server_bind(self)
File "/usr/lib/python3.5/socketserver.py", line 454, in server_bind
self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use
有谁知道我的调试配置有什么问题?
谢谢!!
更新
也许需要更多信息。我使用 docker-compose 文件启动 odoo-server,然后使用 VSCode 远程附加到该 odoo-server。使用 odoo-bin 命令重新启动服务器可以在 VSCode 终端上正常工作。
我有两个 docker 容器正在运行:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ac4a4c8481f odoo:12.0 "/entrypoint.sh odoo…" 7 days ago Up 4 minutes 0.0.0.0:8069->8069/tcp, 8071/tcp odoo-docker_web_1
5910cce38985 postgres:10 "docker-entrypoint.s…" 7 days ago Up 4 minutes 5432/tcp odoo-docker_db_1
并且只有 odoo 服务器在 8069 上运行:
odoo@4ac4a4c8481f:/mnt/extra-addons$ lsof -i :8069
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python3 1 odoo 7u IPv4 44986 0t0 TCP *:8069 (LISTEN)
所以可能我使用“启动”请求类型是错误的,因为它试图重新启动服务器。我也测试了这个配置:
{
"name": "Odoo 12 Attach",
"type": "python",
"request": "attach",
"port": 8069,
"host": "localhost",
},
但随后调试器立即终止而没有错误消息。
解决方案
为了了解remote debugging
所有 Python 服务或基于它的应用程序的工作原理,例如 Odoo、Flask、Django、Web2py 或其他。你必须了解三个不同的概念,docker 容器、调试器、python 应用服务器(在我们的例子中是 Odoo)。所以在很多情况下,当从 docker 运行 Odoo 时,它就像下图:
请注意区别:
- 无需调试,您就有两个端口,一个是内部端口,另一个是外部端口,它将 http 请求从浏览器传递到 Odoo,反之亦然。但是在调试之后你有 4 个端口,其中 2 个用于 http 请求,另外 2 个用于调试信息(在我们的例子中基于 json)从 Vscode 到
debugpy
反之亦然(你也可以使用 2 个端口)。 - 如果不调试您的入口点将是
Dockerfile
. 通过调试,您将入口点修改为debugpy
. 负责运行 Odoo
czuniga,方法非常好,几乎与以下相同:
适用于vscode 1.45.0及更高版本。参考文件https://gist.github.com/kerbrose/e646aaf9daece42b46091e2ca0eb55d0
1-编辑您的docker.dev
文件并插入RUN pip3 install -U debugpy
。这将安装一个 python 包debugpy
而不是已弃用的包,ptvsd
因为您的 vscode(本地)将debugpy
使用它与您的 docker 映像的(远程)服务器通信。
2-启动你的容器。但是,您将启动刚刚安装的 python 包debugpy
。它可能是你 shell 的下一个命令。
docker-compose run --rm -p 8888:3001 -p 8879:8069 {DOCKER IMAGE[:TAG|@DIGEST]} /usr/bin/python3 -m debugpy --listen 0.0.0.0:3001 /usr/bin/odoo --db_user=odoo --db_host=db --db_password=odoo
3-准备您的启动器文件如下。请注意,这port
将与 odoo 服务器有关。debugServer
将是调试服务器的端口
{
"name": "Odoo: Attach",
"type": "python",
"request": "attach",
"port": 8879,
"debugServer": 8888,
"host": "localhost",
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "/mnt/extra-addons",
}
],
"logToFile": true
推荐阅读
- excel - 在personal.xlsb中存储代码以从封闭的WB复制工作簿
- angular - [ng update]:错误 - 无法从工作区根目录解析“@angular-devkit/schematics”包
- reactjs - React-csv 在 react-bootstrap 下拉列表中不起作用
- angular - Angular Reactive forms - 控件的默认值不起作用
- visual-studio - Visual Studio 插件不显示任何视觉数据
- r - 在ggplot循环中制作条形图ggplot
- python - 数据帧逆整形内存
- r - 从地址字符串中提取城市名称
- python - 在 PyQt 文本浏览器中显示数据框
- html - 使用 CSS 的垂直滚动 - 背景颜色不起作用