如何在Docker中调试Odoo?

5

我无法在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服务器,然后用VSCode远程连接到该odoo服务器。使用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)

我可能错了,使用“launch”请求类型是错误的,因为它试图重新启动服务器。我也测试过这个配置:

{
   "name": "Odoo 12 Attach",
   "type": "python",
   "request": "attach",
   "port": 8069,
   "host": "localhost",           
 },

但是调试器会立即终止而不显示错误消息。


错误提示表明端口已经被占用。您是否同时运行了相同的服务? - MaartenDev
不,那只是在该端口上运行的odoo。 - tisq
3个回答

4
为了理解如何对所有基于Python的服务或应用程序(例如Odoo、Flask、Django、Web2py等)进行远程调试,您需要理解三个不同的概念:Docker容器、调试器和Python应用服务器(在我们的案例中是Odoo)。因此,在许多情况下,从Docker运行Odoo就像以下图片所示: enter image description here 而您真正需要能够调试的内容则像以下图片所示: enter image description here 请注意区别。
  • 没有调试时,你有两个端口,一个是内部端口,另一个是外部端口,将从浏览器传递http请求到Odoo,反之亦然。然而,在调试后,你有4个端口,其中2个用于http请求,另外2个用于从Vscode到debugpy的调试信息(在我们的情况下基于json),反之亦然(顺便说一下,你也可以使用2个端口)。
  • 没有调试时,你的入口点是在Dockerfile中定义的内容。有了调试,你修改入口点为debugpy。它将负责运行Odoo。

czuniga的方法非常好,几乎与以下方法相同:

适用于vscode 1.45.0及更高版本。有关文件的参考https://gist.github.com/kerbrose/e646aaf9daece42b46091e2ca0eb55d0

1- 编辑您的docker.dev文件,并插入RUN pip3 install -U debugpy。这会安装一个名为debugpy的Python包,而不是一个已弃用的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文件? - tisq
好的,docker.dev与docker配置相同,具有额外的开发设置。因此您可能没有它。它根据您的环境而定。您可能只有一个Docker文件。 - kerbrose
我通过在docker-compose.yml中的命令安装debugpy来解决了这个问题,因此我不需要docker.dev文件。 - tisq

3

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

  1. 使用docker-compose updocker run启动容器
  2. 使用管理员权限访问您的odoo容器,命令为:docker exec -it -u 0 "容器名称" /bin/bash
  3. 安装ptvsd,命令为:pip3 install ptvsd
  4. 更新odooaddons/__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 "容器名" 退出容器并重新启动。
  2. 执行docker inspect "容器名" 并复制 Networks 栏下的 IPAddress
  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日志

enter image description here

注意:请确保在容器上暴露端口3000


如果我在launch.json中添加"debugServer": 3000,它对我有效。谢谢! - tisq
有时候重启docker-compose后,odoo会被关闭。您知道在这种情况下我该怎么做吗? - tisq

0

检查正在运行的容器以及本地运行的odoo实例,确保某些东西确实在该端口上运行

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

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

[另请参阅](https://docs.docker.com/engine/reference/commandline/port/


一个Odoo实例正在8069端口上运行。我只有两个Docker容器在运行 - 即Odoo和PostgreSQL容器。 - tisq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接