Как запустить pdb внутри Docker-контейнера - PullRequest
0 голосов
/ 02 мая 2019

Я явно чего-то здесь не понимаю.Я пытаюсь запустить отладчик pdb в интерактивном режиме с контейнером Docker.

Вот код:

Dockerfile:

FROM python:3.6
ENV PROJECT_DIR=/opt/foo
WORKDIR $PROJECT_DIR
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "foo.py"]

foo.py:

def hello_world():
    print("hello world")
if __name__ == '__main__':
    #import pdb; pdb.set_trace()
    hello_world()

Если я запускаю docker build -t foo ., а затем docker run foo, он выводит «привет мир», как и ожидалось.

Ноесли я раскомментирую вызов pdb.set_trace() выше и попытаюсь снова, я получаю следующую ошибку:

/opt/foo/foo.py(8)<module>()
-> hello_world()
(Pdb) 
Traceback (most recent call last):
  File "foo.py", line 8, in <module>
    hello_world()
  File "foo.py", line 8, in <module>
    hello_world()
  File "/usr/local/lib/python3.6/bdb.py", line 51, in trace_dispatch
    return self.dispatch_line(frame)
  File "/usr/local/lib/python3.6/bdb.py", line 70, in dispatch_line
    if self.quitting: raise BdbQuit
bdb.BdbQuit

Что я не получаю?


edit: BbdQuit, возникающий при отладке python , является , а не повторяющейся проблемой.

Моя проблема, как правильно определил @soundstripe, не обеспечивала интерактивный доступ с Docker для pdb.

1 Ответ

3 голосов
/ 02 мая 2019

pdb ожидает использования терминала с TTY.Вы можете легко запустить pdb, сказав Docker подключить интерактивный TTY в контейнере к вашему терминалу с помощью -it:

docker run -it foo

Я также обычно добавляю опцию --rm для удалениямои временные контейнеры.

docker run -it --rm foo

Но это не всегда лучше во время отладки, поскольку контейнер исчезает, когда вы закончите.

...