Docker의 Python 디버깅 : 초보자를위한 튜토리얼

Docker의 Python 디버깅 : 초보자를위한 튜토리얼

Docker의 Python 디버깅 : 초보자를위한 튜토리얼Docker의 Python 디버깅 : 초보자를위한 튜토리얼
저자의 이미지 | 표의 문자

소개

도커 다양한 시스템에서 일관된 환경을 제공하여 응용 프로그램을 개발, 배송 및 실행하는 방법을 단순화했습니다. 그러나이 일관성은 트레이드 오프와 함께 제공됩니다. 파이썬 응용 프로그램을 포함한 애플리케이션이 Docker 컨테이너 내부에서 실행될 때 디버깅은 초보자에게 기만적으로 복잡해집니다.

Docker를 처음 접하는 사람들의 경우 파이썬 응용 프로그램을 디버깅하면 후드 용접이 셧다운 상태에서 자동차를 고치려고하는 느낌이들 수 있습니다. 당신은 뭔가 잘못되었다는 것을 알고 있지만 내부에서 무슨 일이 일어나고 있는지 알 수는 없습니다.

이 초보자 친화적 인 튜토리얼은 Docker에서 파이썬 디버깅을 시작하는 방법을 알려줍니다.

Docker의 디버깅이 다른 이유는 무엇입니까?

우리가 다이빙하기 전에 Docker가 왜 디버깅을 까다 롭게 만드는지 이해합시다. 컴퓨터에서 로컬로 Python을 실행할 때 다음을 수행 할 수 있습니다.

  • 즉시 오류 메시지를 참조하십시오
  • 파일을 편집하고 다시 실행하십시오
  • 좋아하는 디버깅 도구를 사용하십시오
  • 어떤 파일이 존재하는지 확인하십시오

그러나 Python이 Docker 컨테이너 안으로 들어가면 특히 초보자라면 종종 까다 롭고 덜 직접적입니다. 컨테이너에는 자체 파일 시스템, 자체 환경 및 자체 실행 프로세스가 있습니다.

우리 예를 설정합니다

버그가있는 간단한 파이썬 프로그램부터 시작하겠습니다. Docker에 대해 아직 걱정하지 마십시오. 먼저 우리와 함께 일하는 것을 이해합시다.

호출 된 파일을 만듭니다 app.py:

def calculate_sum(numbers):
    total = 0
    for num in numbers:
        total += num
        print(f"Adding {num}, total is now {total}")
    return total

def main():
    numbers = [1, 2, 3, 4, 5]
    result = calculate_sum(numbers)
    print(f"Final result: {result}")
    
    # This line will cause our program to crash!
    division_result = 10 / 0
    print(f"Division result: {division_result}")

if __name__ == "__main__":
    main()

이것을 정상적으로 실행하는 경우 python3 app.py합계를 올바르게 계산하지만 “제로”오류로 충돌합니다. 쉽게 발견하고 수정해야합니까?

이제이 간단한 응용 프로그램이 Docker 컨테이너 내부에서 실행될 때 어떻게되는지 살펴 보겠습니다.

첫 Docker 컨테이너 생성

우리는 Docker에게 Python 프로그램을 포장하는 방법을 알려야합니다. `dockerfile`라는 파일을 만듭니다.

FROM python:3.11-slim

WORKDIR /app

COPY app.py .

CMD ["python3", "app.py"]

각 줄을 설명하겠습니다.

  • FROM python:3.11-slim Docker에게 이미 Python이 설치된 사전 제작 된 Linux 시스템으로 시작하도록 지시합니다.
  • WORKDIR /app 컨테이너 내부에`/app` 폴더를 생성하고 작업 디렉토리로 설정합니다.
  • COPY app.py . 당신의 사본 app.py 컴퓨터에서 컨테이너 내부의`/app` 폴더로 파일
  • CMD ["python3", "app.py"] 컨테이너가 시작될 때 Docker에게 어떤 명령을 실행 해야하는지 알려줍니다.

이제이 컨테이너를 만들고 실행합시다.

docker build -t my-python-app .
docker run my-python-app

오류를 포함하여 출력이 표시되지만 컨테이너는 멈추고 종료됩니다. 이렇게하면 고립 된 용기 내부에서 무엇이 잘못되었는지 알아냅니다.

1. 대화식 디버깅 세션 실행

필요한 첫 번째 디버깅 기술은 러닝 컨테이너에 들어가서 잠재적 인 문제를 확인하는 방법을 배우는 것입니다.

Python 프로그램을 즉시 실행하는 대신 컨테이너를 시작하고 그 안에 명령 프롬프트를 받으십시오.

docker run -it my-python-app /bin/bash

이 새로운 깃발을 분해하겠습니다.

  • -i “대화식”을 의미합니다 – 입력 스트림을 유지하여 명령을 입력 할 수 있습니다.
  • -t “pseudo-tty”를 할당합니다-기본적으로 말기가 올바르게 작동합니다.
  • /bin/bash 일반 명령을 대신하고 대신 배쉬 쉘을 제공합니다.

컨테이너 내부에 터미널이 있으므로 다음과 같은 명령을 실행할 수 있습니다.

# See what directory you're in
pwd

# List files in the current directory
ls -la

# Look at your Python file
cat app.py

# Run your Python program
python3 app.py

또한 오류가 표시됩니다.

root@fd1d0355b9e2:/app# python3 app.py
Adding 1, total is now 1
Adding 2, total is now 3
Adding 3, total is now 6
Adding 4, total is now 10
Adding 5, total is now 15
Final result: 15
Traceback (most recent call last):
  File "/app/app.py", line 18, in 
    main()
  File "/app/app.py", line 14, in main
    division_result = 10 / 0
                      ~~~^~~
ZeroDivisionError: division by zero

이제 당신은 할 수 있습니다 :

  • 컨테이너에서 바로 여기 파일 편집 (편집기를 먼저 설치해야하지만)
  • 다른 것이 무엇인지 이해하기 위해 환경을 탐색하십시오
  • 작은 코드를 대화식으로 테스트하십시오

제로 오류로 구분을 수정하십시오 (`10 / 0`으로`10 / 2`를 변경할 수 있음) 파일을 저장 한 다음 다시 실행하십시오.

문제가 수정되었습니다. 그러나 컨테이너를 종료하면 변경 사항을 잃어 버립니다. 이것은 우리를 다음 기술로 가져옵니다.

2. 라이브 편집에 볼륨 장착 사용

컴퓨터에서 파일을 편집하고 해당 변경 사항이 컨테이너 내부에 자동으로 표시되면 좋지 않습니까? 그것이 바로 볼륨 장착이하는 일입니다.

docker run -it -v $(pwd):/app my-python-app /bin/bash

여기 새로운 부분은입니다 -v $(pwd):/app:

  • $(pwd) 현재 디렉토리 경로를 출력합니다.
  • :/app 현재 디렉토리를지도합니다 /app 컨테이너 내부.
  • 컴퓨터에서 변경 한 파일도 컨테이너 내부에서 즉시 변경됩니다.

이제 당신은 할 수 있습니다 :

  1. 편집하다 app.py 좋아하는 편집기를 사용하여 컴퓨터에서
  2. 컨테이너 내부에서 실행하십시오 python3 app.py 변경 사항을 테스트합니다
  3. 작동 할 때까지 편집 및 테스트를 계속하십시오

Divisor를 2로 변경 한 후 샘플 출력은 다음과 같습니다.

root@3790528635bc:/app# python3 app.py
Adding 1, total is now 1
Adding 2, total is now 3
Adding 3, total is now 6
Adding 4, total is now 10
Adding 5, total is now 15
Final result: 15
Division result: 5.0

컴퓨터에서 친숙한 편집 환경과 컨테이너 내부의 정확한 환경을 사용하기 때문에 유용합니다.

3. IDE에서 원격 디버거를 연결하십시오

IDE (Integrated Development Environment)와 같은 경우 대 코드 또는 Pycharm실제로 IDE 디버거를 Docker 컨테이너 내부에서 실행하는 코드에 직접 연결할 수 있습니다. 이것은 당신에게 IDE의 디버깅 도구의 전체 힘을 제공합니다.

`dockerfile ‘처럼 편집하십시오.

FROM python:3.11-slim

WORKDIR /app

# Install the remote debugging library
RUN pip install debugpy

COPY app.py .

# Expose the port that the debugger will use
EXPOSE 5678

# Start the program with debugger support
CMD ["python3", "-m", "debugpy", "--listen", "0.0.0.0:5678", "--wait-for-client", "app.py"]

이것이하는 일 :

  • pip install debugpy Microsoft를 설치합니다 디버시 도서관.
  • EXPOSE 5678 Docker에게 컨테이너는 포트 5678을 사용할 것이라고 말합니다.
  • 그만큼 CMD 연결을 위해 포트 5678에서 청취하여 디버거를 통해 프로그램을 시작합니다. 파이썬 코드를 변경할 필요가 없습니다.

컨테이너를 빌드하고 실행하십시오.

docker build -t my-python-app .
docker run -p 5678:5678 my-python-app

그만큼 -p 5678:5678 컨테이너 내부에서 컴퓨터의 포트 5678까지 포트 5678을지도.

이제 VS 코드에서 디버그 구성을 설정할 수 있습니다 ( .vscode/launch.json) 컨테이너에 연결하려면 :

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Remote Attach",
            "type": "python",
            "request": "attach",
            "connect": {
                "host": "localhost",
                "port": 5678
            }
        }
    ]
}

VS 코드에서 디버깅을 시작하면 컨테이너에 연결되며 로컬 코드와 마찬가지로 중단 점을 설정하고 변수를 검사하며 코드를 진행할 수 있습니다.

일반적인 디버깅 문제 및 솔루션

⚠️ “내 프로그램은 내 컴퓨터에서 작동하지만 Docker에서는 작동하지 않습니다”

이것은 일반적으로 환경에 차이가 있음을 의미합니다. 확인하다:

  • 파이썬 버전 차이.
  • 누락 된 종속성.
  • 다른 파일 경로.
  • 환경 변수.
  • 파일 권한.

⚠️ “내 인쇄문을 볼 수 없어”

  • 사용 python -u 출력 버퍼링을 피하기 위해.
  • 당신이 함께 달리고 있는지 확인하십시오 -it 대화식 출력을 원한다면.
  • 프로그램이 실제로 의도 한대로 실행 중인지 확인하십시오 (아마도 일찍 종료 될 수 있음).

⚠️ “내 변화가 나타나지 않는다”

  • 볼륨 장착을 사용하고 있는지 확인하십시오 (-v).
  • 올바른 파일을 편집하고 있는지 확인하십시오.
  • 파일이 컨테이너에 복사되어 있는지 확인하십시오.

⚠️ “컨테이너가 즉시 종료됩니다”

  • 함께 실행하십시오 /bin/bash 컨테이너 상태를 검사합니다.
  • 오류 메시지를 확인하십시오 docker logs container_name.
  • 당신을 확인하십시오 CMD Dockerfile에서는 정확합니다.

결론

이제 Docker에서 Python을 디버깅하기위한 기본 툴킷이 있습니다.

  1. 대화식 쉘 (docker run -it ... /bin/bash) 탐색 및 빠른 수정
  2. 볼륨 장착 (-v $(pwd):/app) 로컬 파일 시스템에서 편집하기 위해
  3. IDE의 전체 기능을 사용하기위한 원격 디버깅

그런 다음 복잡한 응용 프로그램을 관리하기 위해 Docker Compose를 사용해 볼 수 있습니다. 지금은 이러한 간단한 기술로 시작하십시오. 대부분의 디버깅 문제는 컨테이너 안으로 들어가서 찌르기 만하면 해결할 수 있습니다.

열쇠는 체계적인 것입니다. 무슨 일이 일어나고 있는지 이해하고 실제로 무슨 일이 일어나고 있는지 파악한 다음 둘 사이의 간격을 연결하십시오.. 행복한 디버깅!

발라 프리 야 c 인도의 개발자이자 기술 작가입니다. 그녀는 수학, 프로그래밍, 데이터 과학 및 컨텐츠 제작의 교차점에서 일하는 것을 좋아합니다. 그녀의 관심 분야와 전문 지식에는 DevOps, 데이터 과학 및 자연어 처리가 포함됩니다. 그녀는 독서, 쓰기, 코딩 및 커피를 즐깁니다! 현재 그녀는 자습서, 방법 안내, 의견 조각 등을 통해 개발자 커뮤니티와 지식을 배우고 공유하는 작업을하고 있습니다. Bala는 또한 매력적인 리소스 개요 및 코딩 자습서를 만듭니다.

출처 참조

Post Comment

당신은 놓쳤을 수도 있습니다