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
컨테이너 내부.- 컴퓨터에서 변경 한 파일도 컨테이너 내부에서 즉시 변경됩니다.
이제 당신은 할 수 있습니다 :
- 편집하다
app.py
좋아하는 편집기를 사용하여 컴퓨터에서 - 컨테이너 내부에서 실행하십시오
python3 app.py
변경 사항을 테스트합니다 - 작동 할 때까지 편집 및 테스트를 계속하십시오
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을 디버깅하기위한 기본 툴킷이 있습니다.
- 대화식 쉘 (
docker run -it ... /bin/bash
) 탐색 및 빠른 수정 - 볼륨 장착 (
-v $(pwd):/app
) 로컬 파일 시스템에서 편집하기 위해 - IDE의 전체 기능을 사용하기위한 원격 디버깅
그런 다음 복잡한 응용 프로그램을 관리하기 위해 Docker Compose를 사용해 볼 수 있습니다. 지금은 이러한 간단한 기술로 시작하십시오. 대부분의 디버깅 문제는 컨테이너 안으로 들어가서 찌르기 만하면 해결할 수 있습니다.
열쇠는 체계적인 것입니다. 무슨 일이 일어나고 있는지 이해하고 실제로 무슨 일이 일어나고 있는지 파악한 다음 둘 사이의 간격을 연결하십시오.. 행복한 디버깅!
발라 프리 야 c 인도의 개발자이자 기술 작가입니다. 그녀는 수학, 프로그래밍, 데이터 과학 및 컨텐츠 제작의 교차점에서 일하는 것을 좋아합니다. 그녀의 관심 분야와 전문 지식에는 DevOps, 데이터 과학 및 자연어 처리가 포함됩니다. 그녀는 독서, 쓰기, 코딩 및 커피를 즐깁니다! 현재 그녀는 자습서, 방법 안내, 의견 조각 등을 통해 개발자 커뮤니티와 지식을 배우고 공유하는 작업을하고 있습니다. Bala는 또한 매력적인 리소스 개요 및 코딩 자습서를 만듭니다.
Post Comment