Docker-Comose 和 pdb

我知道我不是第一个问这个问题的人,但这个问题没有明确的答案:

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

当你问谷歌叔叔关于 django docker的时候,你会得到一些很棒的 docker ——作曲家的例子和教程,而且我有一个可以工作的环境——我可以运行 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,我不想要的。

善良的人们愿意帮助我。

附言
我在这个例子中使用 pdb + + 和一个基本的 docker-compose。来自 这个姜戈的例子的 yml。我也尝试过,但似乎没有什么对我有帮助。而且我使用的是 Docker 作曲家 1.3.0 rc3,因为它支持 Dockerfile 指向。

21991 次浏览

Try running your web container with the --service-ports option: docker-compose run --service-ports web

Use the following steps to attach pdb on any python script.

Step 1. Add the following in your yml file

stdin_open: true
tty: true

This will enable interactive mode and will attach stdin. This is equivalent for -it mode.

Step 2.

docker attach <generated_containerid>

You'll now get the pdb shell

Till my experience, docker-compose up command does not provide an interactive shell, but it starts the printing STDOUT to default read-only shell.

Or if you have specified and mapped logs directory, docker-compose up command will print nothing on the attached shell but it sends output to your mapped logs. So you have to attach the container separately once it is running.

when you do docker-compose up, make it in detached mode via -d and connect to the container via

docker exec -it your_container_name bash

If after the adding of

stdin_open: true
tty: true

you started to get issues similar to that:

        fd = self._input_fileno()
if fd is not None and fd in ready:
>           return ord(os.read(fd, 1))
E           TypeError: ord() expected a character, but string of length 0 found

You can try to add ENV LC_ALL en_US.UTF-8 at the top of your Docker file

FROM python:3.8.2-slim-buster as build_base
ENV LC_ALL en_US.UTF-8