Docker-compose and pdb
Docker-compose and pdb
我看到我不是第一个问这个问题的人,但是没有一个明确的答案:
如何在Python开发中使用pdb和docker-composer?
当你在谷歌上搜索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_13
和dir_db_4
,这完全不是我想要的。
好心的人们,请帮助我。
PS
我在这个示例中使用了pdb ++,以及来自这个django示例的基本docker-compose.yml。我也进行了实验,但似乎没有任何帮助。我正在使用docker-composer 1.3.0rc3,因为它支持Dockerfile的指向。
问题出现的原因是在添加了stdin_open: true
和tty: true
之后,出现了类似于TypeError: ord() expected a character, but string of length 0 found
的问题。
解决方法是在Docker文件的顶部添加ENV LC_ALL en_US.UTF-8
。
以下是整理后的文章:
如果在添加了stdin_open: true
和tty: true
之后,你开始遇到类似于TypeError: ord() expected a character, but string of length 0 found
的问题,你可以尝试在Docker文件的顶部添加ENV LC_ALL en_US.UTF-8
。
示例代码如下:
FROM python:3.8.2-slim-buster as build_base ENV LC_ALL en_US.UTF-8
这个问题的出现是因为在添加了stdin_open: true
和tty: true
之后,可能会导致TypeError: ord() expected a character, but string of length 0 found
错误。
为了解决这个问题,我们可以在Docker文件的顶部添加ENV LC_ALL en_US.UTF-8
。这将设置环境变量LC_ALL为en_US.UTF-8,以确保正确的字符编码。
希望这个解决方法能够帮助你解决问题!
Docker-compose and pdb 是一个出现的问题,下面的内容给出了原因和解决方法。
原因:在使用 docker-compose up 启动所有容器时,无法通过附加 pdb 来调试 Python 脚本。
解决方法:
步骤1:在 yml 文件中添加以下内容:
stdin_open: true
tty: true
这将启用交互模式并附加 stdin。这相当于使用 -it 模式。
步骤2:执行以下命令:
docker attach
这将进入 pdb shell。
这种方法对于大多数人来说效果很好,但也有一些人反映不起作用。在我看来,这个答案应该被接受。虽然有一些小问题,但绝对可以实现问题的要求。
需要注意的是,在步骤2中,需要附加到容器的 ID,而不是实例的 ID。可以通过执行 `docker ps` 命令来查看容器的 ID。
这种方法与 `docker-compose up` 结合使用非常有效。重要的是要注意,语句将在第二个 shell 标签页中打开,即在运行 `docker attach
以上是附加 pdb 调试 Python 脚本的步骤。通过在 yml 文件中添加交互模式和附加 stdin 的配置,然后使用 `docker attach` 命令附加到容器 ID,就可以进入 pdb shell 进行调试。这个方法在大多数情况下都能正常工作,但也可能存在一些小问题。
问题出现的原因是使用docker-compose run命令无法在pdb中显示终端。
解决方法是使用--service-ports选项来运行web容器,命令为docker-compose run --service-ports web
。另外,还可以使用docker-compose run --rm --service-ports my-awesome-app python app.py 0.0.0.0:8000
来运行服务或测试。
同时,还需要添加-it选项,例如docker-compose run -it --service-ports web
。
另外,也可以使用docker-compose up
命令来实现相同的功能。
若要在docker-compose run命令中运行其他服务,可以使用--name <name>
选项来为容器命名,并使用--rm
选项在容器停止后自动删除,命令示例如下:docker-compose run --rm --service-ports --name my-awesome-app my-awesome-app
。
感谢提供帮助的人,并解决了问题,节省了大量的时间。同时,还提出了如何在docker-compose run中进行调试会话,并解决了运行其他服务的问题。