【问题标题】:Docker-compose and pdbDocker-compose 和 pdb
【发布时间】:2015-08-31 12:39:00
【问题描述】:

我发现我不是第一个提出这个问题的人,但对此没有明确的答案:

如何在 Python 开发中使用 pdb 和 docker-composer?

当您向 Google 叔叔询问 django docker 时,您会得到很棒的 docker-composer 示例和教程,并且我有一个可以运行的环境 - 我可以运行 docker-compose up 并且我有一个整洁的开发人员环境 但是 PDB 不工作 (这很可悲)。

我可以通过运行docker-compose run my-awesome-app python app.py 0.0.0.0:8000 解决问题,但随后我可以从主机通过http://127.0.0.1:8000 访问我的应用程序(我可以使用docker-compose up),而且似乎每次我使用run 时,新容器都会像这样: dir_app_13dir_db_4 我根本不想要。

好心人请帮助我。

PS
我在该示例中使用 pdb++ 和来自this django example 的基本 docker-compose.yml。我也尝试过,但似乎没有任何帮助。我正在使用 docker-composer 1.3.0rc3,因为它支持 Dockerfile 指向。

【问题讨论】:

    标签: python docker pdb docker-compose


    【解决方案1】:

    根据我的经验,docker-compose up 命令不提供交互式 shell,但它会将 STDOUT 打印到默认的只读 shell。

    或者,如果您已经指定并映射了日志目录,docker-compose up 命令将不会在附加的 shell 上打印任何内容,但会将输出发送到您的映射日志。因此,一旦容器运行,您必须单独附加容器。

    当您执行docker-compose up 时,通过-d 使其处于分离模式并通过

    连接到容器

    docker exec -it your_container_name bash

    【讨论】:

    • 您好,您能具体说明拒绝我的答案的原因吗?这将帮助我提高自己并纠正错误。谢谢!
    • exec 会在运行的容器中为您提供一个 shell,并且使用 -it 是的,它是交互式的,但您不会连接到正在运行的应用程序,因此不会连接到 pdb stdin/stdout。正确的做法是让compose在stdin打开和tty的情况下启动服务,然后附加到进程(让stdin工作)。
    • 明白你的意思,......当我们尝试使用 exec 时,这就像启动另一个实例......虽然对于 PDB,......我有一个更好的替代方案,它是基于 Web 和与 docker 一起运行很棒....github.com/Kozea/wdb#docker
    【解决方案2】:

    使用以下步骤在任何 python 脚本上附加 pdb。

    第 1 步。在 yml 文件中添加以下内容

    stdin_open: true
    tty: true
    

    这将启用交互模式并附加标准输入。这等效于 -it 模式。

    第 2 步。

    docker attach <generated_containerid>
    

    您现在将获得 pdb shell

    【讨论】:

    • 当我尝试使用 docker-compose up 启动我的所有容器时,这对我来说非常有效,谢谢。
    • 出于某种原因,这对我不起作用。我有 docker-compose 2.1 版
    • 鉴于问题的框架,我很惊讶这不是公认的答案。有一些怪癖,但绝对符合要求。
    • 对于第 2 步,需要附加到容器 id,而不是实例 id,即如果您执行 docker ps 会看到的 id 之一
    • 第二步是这里最重要的部分。
    【解决方案3】:

    尝试使用 --service-ports 选项运行您的 Web 容器:docker-compose run --service-ports web

    【讨论】:

    • 做到了!谢谢你,先生。我现在使用 docker-compose 来创建我的环境并运行我的服务,或者使用docker-compose run --rm --service-ports my-awesome-app python app.py 0.0.0.0:8000 进行测试。再见流浪汉!
    • 我在使用这种方法时遇到了一些问题。当我在 pdb 中输入内容时,我的终端是空白的
    • 你进入 pdb 提示符了吗?如果没有更多信息,例如您正在使用什么框架、什么服务等,我不知道如何提供帮助。
    • 我认为您还需要类似 -it:检查下面的答案
    • 没有理由避免 docker-compose up 使用此功能,如下所述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多