【问题标题】:How to debug odoo in docker?如何在 docker 中调试 odoo?
【发布时间】:2025-11-30 21:35:02
【问题描述】:

我无法在 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",           
 },

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

【问题讨论】:

  • 该错误表示该端口已被使用。您是否两次运行相同的服务?
  • 不,只是 odoo 在那个端口上运行。

标签: docker debugging visual-studio-code odoo


【解决方案1】:

为了了解 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(本地)将使用它与您的 docker 映像的 debugpy(远程)服务器通信。

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

【讨论】:

  • 在哪里可以找到 docker.dev 文件?
  • 好吧 docker.dev 与带有额外开发设置的 docker 配置相同。所以你可能没有它。这是根据你的环境。你可能有一个 docker 文件。
  • 我通过 docker-compose.yml 中的命令安装 debugpy 解决了这个问题,所以我不需要 docker.dev 文件。
【解决方案2】:

我按照以下步骤使其工作:

  1. 使用docker-compose updocker run 启动容器
  2. 使用 root 权限访问您的 odoo 容器 docker exec -it -u 0 "container name" /bin/bash
  3. 安装ptvsd pip3 install ptvsd
  4. 更新odoo addons/__init__.py文件以启用ptvsd附件,找到/usr/lib/python3/dist-packages/odoo/addons/__init__.py中的文件并在文件末尾添加以下代码:
import ptvsd
ptvsd.enable_attach(address=('0.0.0.0', 3000))

ptvsd.wait_for_attach()
  1. 退出容器并使用docker-compose restartdocker restart "container name" 重新启动
  2. 执行docker inspect "container name"并将IPAddress复制到Networks部分下
  3. 打开Visual Studio并创建launch.json,将容器ip粘贴到host字段和ptvsd附加方法上指定的port下,例如。在我的情况下,IP 是 172.27.0.3
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Remote Attach",
            "type": "python",
            "request": "attach",
            "port": 3000,
            "host": "172.27.0.3",
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "."
                }
            ]
        }
    ]
}
  1. 点击开始调试,您应该能够在调试控制台上看到 odoo 日志

注意:一定要在容器上暴露3000端口

【讨论】:

  • 如果我在launch.json中添加“debugServer”:3000,它对我有用。谢谢!
  • 有时在重新启动 docker-compose odoo 时会处于关闭状态。你知道在这种情况下我能做什么吗?
【解决方案3】:

检查正在运行的容器以及本地运行的 odoo 实例,这些实例肯定在该端口上运行

lsof -i :8069 >> 尝试使用您正在使用的端口号代替 8069 运行它

docker ps >> 要进一步查看所有正在运行的容器,您可以使用 pycham 在容器中运行调试

[另见] (https://docs.docker.com/engine/reference/commandline/port/)

【讨论】:

  • 一个 odoo 实例正在该端口 8069 上运行。我只有两个 docker 容器在运行 - 即 odoo- 和 postgreSQL-container。