如何在docker中调试odoo?

tis*_*isq 5 debugging docker odoo visual-studio-code

我无法在 docker 容器中调试 odoo。

\n\n

我正在使用 Visual Studio Code,并且具有以下 launch.json 配置。

\n\n
{\n   "version": "0.2.0",\n   "configurations": [\n       {\n           "name": "Odoo 12",\n           "type": "python",\n           "request": "launch",\n           "stopOnEntry": false,\n           "pythonPath": "${config:python.pythonPath}",\n           "program": "/usr/bin/odoo",\n           "args": [\n             "--config=/etc/odoo/odoo.conf"\n           ]\n       }\n   ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

每次启动调试器时,都会出现此错误:

\n\n
Exception in thread odoo.service.httpd:\nTraceback (most recent call last):\n  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner\n    self.run()\n  File "/usr/lib/python3.5/threading.py", line 862, in run\n    self._target(*self._args, **self._kwargs)\n  File "/usr/lib/python3/dist-packages/odoo/service/server.py", line 410, in http_thread\n    self.httpd = ThreadedWSGIServerReloadable(self.interface, self.port, app)\n  File "/usr/lib/python3/dist-packages/odoo/service/server.py", line 136, in __init__\n    handler=RequestHandler)\n  File "/usr/lib/python3/dist-packages/werkzeug/serving.py", line 476, in __init__\n    HTTPServer.__init__(self, (host, int(port)), handler)\n  File "/usr/lib/python3.5/socketserver.py", line 440, in __init__\n    self.server_bind()\n  File "/usr/lib/python3/dist-packages/odoo/service/server.py", line 151, in server_bind\n    super(ThreadedWSGIServerReloadable, self).server_bind()\n  File "/usr/lib/python3.5/http/server.py", line 138, in server_bind\n    socketserver.TCPServer.server_bind(self)\n  File "/usr/lib/python3.5/socketserver.py", line 454, in server_bind\n    self.socket.bind(self.server_address)\nOSError: [Errno 98] Address already in use\n
Run Code Online (Sandbox Code Playgroud)\n\n

有谁知道我的调试配置有什么问题?

\n\n

谢谢!!

\n\n

更新

\n\n

也许需要更多信息。\n我使用 docker-compose 文件启动 odoo-server,然后使用 VSCode 远程连接到该 odoo-server。\n使用 odoo-bin 命令重新启动服务器可以在 VSCode 终端上正常工作。

\n\n

我有两个正在运行的 docker 容器:

\n\n
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES\n4ac4a4c8481f        odoo:12.0           "/entrypoint.sh odoo\xe2\x80\xa6"   7 days ago          Up 4 minutes        0.0.0.0:8069->8069/tcp, 8071/tcp   odoo-docker_web_1\n5910cce38985        postgres:10         "docker-entrypoint.s\xe2\x80\xa6"   7 days ago          Up 4 minutes        5432/tcp                           odoo-docker_db_1\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且只有 odoo 服务器在 8069 上运行:

\n\n
odoo@4ac4a4c8481f:/mnt/extra-addons$ lsof -i :8069\nCOMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME\npython3   1 odoo    7u  IPv4  44986      0t0  TCP *:8069 (LISTEN)\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我可能错误地使用了“启动”请求类型,因为它尝试重新启动服务器。\n我也测试过这个配置:

\n\n
{\n   "name": "Odoo 12 Attach",\n   "type": "python",\n   "request": "attach",\n   "port": 8069,\n   "host": "localhost",           \n },\n
Run Code Online (Sandbox Code Playgroud)\n\n

但随后调试器立即终止,没有错误消息。

\n

ker*_*ose 5

为了了解remote debugging所有 Python 服务或基于它的应用程序(例如 Odoo、Flask、Django、Web2py 等)的工作原理。你必须理解三个不同的概念:docker 容器、调试器、python 应用服务器(在我们的例子中是 Odoo)。所以在很多情况下,当从 docker 运行 Odoo 时,它就像下图所示: 在此输入图像描述

您真正需要能够调试的内容如下图所示: 在此输入图像描述

请注意区别:

  • 无需调试,您就有两个端口,一个是内部端口,另一个是外部端口,它将把来自浏览器的 http 请求传递到 Odoo,反之亦然。然而调试后你有 4 个端口,其中 2 个用于 http 请求,另外 2 个用于从 Vscode 到调试信息(在我们的例子中基于 json),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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)