首页 > 解决方案 > 如何在 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",           
 },

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

标签: dockerdebuggingvisual-studio-codeodoo

解决方案


为了了解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

推荐阅读