Pycharm调试docker compose中的manage.py命令

Posted

技术标签:

【中文标题】Pycharm调试docker compose中的manage.py命令【英文标题】:Pycharm debugging manage.py commands in docker compose 【发布时间】:2019-02-26 23:50:24 【问题描述】:

我有一个非常简单的设置。我正在运行 Pycharm 2018.2.3 并使用 docker compose 启动 3 个容器。

    我的 Django 应用程序 nginx 提供静态服务 Postgres 数据库

我已经为调试容器配置了远程解释器,并且断点在大多数情况下都可以正常工作,至少当我点击我的 API 端点或对 django 应用程序执行一些其他操作时。

什么不起作用,是当我运行我的管理自定义 manage.py 自定义命令之一时。到目前为止,我已经尝试了这两种方法。

    我在 PyCharm 中设置了另一个调试配置来执行命令。这会导致另一个容器旋转(代替原来的容器。运行命令,而不会中断任何换行符。然后整个容器关闭。

    我已经登录容器,直接通过命令行运行manage.py命令,在容器中执行,还是没有断点。

文档似乎在正常情况下工作,但我在容器中调试这些命令时找不到任何帮助。

感谢任何帮助或提示。

【问题讨论】:

到目前为止,我认为效果最好的是我只是将我的 manage.py 命令绑定到我的 API 服务中。我可以使用我通常使用 API 和常规 PyCharm 调试器运行的任何命令,在我的容器中运行就可以了。 【参考方案1】:

为了在 Docker 容器中调试 Django 命令,您可以使用以下设置创建新的运行/调试配置

    使用 Python 配置模板 脚本路径:manage.py 的绝对位置 参数:要调试/执行的Django命令 !important! Python 解释器:Docker Compose interpreter

【讨论】:

【参考方案2】:

只是更新,以防有人遇到类似问题。我个人的解决方案是不使用 manage.py 命令,而是通过 http 调用使这些相同的命令可用。

我发现简单地拥有像 myserver.com/api/do-admin-function 这样的端点并将其限制为管理访问会更容易(而且通常更有用)。

当我在我的代码中放置断点时,即使在容器中运行,它也会按预期中断,并允许我按照我想要的方式进行调试

【讨论】:

有趣,而且比我自己的回答更具体。赞成。【参考方案3】:

这取决于您的docker-compose.yml 的确切内容。

例如参见Adam King的文章“A Simple Recipe for Django Development In Docker (Bonus: Testing with Selenium)”的“An interactive debugger inside a running container!”部分。

他的docker-compose.yml 包括:

version: "2"
services:
  django:
    container_name: django_server
    build:
      context: .
      dockerfile: Dockerfile
    image: docker_tutorial_django
    stdin_open: true
    tty: true
    volumes:
      - .:/var/www/myproject
    ports:
      - "8000:8000"

在里面,看:

stdin_open: true
tty: true

[这两行] 很重要,因为它们让我们运行交互式终端。 点击 ctrl-c 以终止在您的终端中运行的服务器,然后在后台使用 docker-compose up -d 启动它。docker ps 告诉我们它还在运行:

我们需要附加到正在运行的容器,以便查看其服务器输出和 pdb 断点。 命令 docker attach django_server 将显示一个空行,但如果您刷新 Web 浏览器,您将看到服务器输出。 将import pdb; pdb.set_trace() 放入您的代码中,您将获得交互式调试器,就像您习惯的那样。

【讨论】:

感谢您的回复。我相信即使没有在 docker compose 中添加选项(我没有),我仍然可以通过执行 docker attach -it /bin/sh 来获得交互式终端。但我试图让 PyC​​harm IDE 调试器在运行 manage.py 命令时中断。我现在没有使用任何 pbd 代码。是否只需要 get 获取 manage.py 命令才能在编辑器中中断? @G.Ball 本地应用不需要,但远程应用需要...youtrack.jetbrains.com/issue/PY-22623

以上是关于Pycharm调试docker compose中的manage.py命令的主要内容,如果未能解决你的问题,请参考以下文章

Pycharm 在 docker 托管应用程序上运行“使用 cython 的调试器加速”

docker-compose 用于将 VS Code 中的 node.js 调试器附加到 WSL docker 中的节点进程

使用`docker-compose run`时无法调试,但`docker-compose up`有效

Pycharm docker-compose解释器不加载库

如何使用 Pycharm 逐步完成使用 Django 和 docker-compose 的测试?

使用远程调试运行 docker-compose。智能,Java 11