컨테이너 내 Python 디버깅
Python 프로젝트에 Docker 파일을 추가하면 컨테이너 내에서 애플리케이션을 디버깅할 수 있도록 작업 및 시작 구성이 추가됩니다. Python 프로젝트의 다양한 시나리오를 수용하기 위해 일부 앱에는 추가 구성이 필요할 수 있습니다.
컨테이너 진입점 구성
tasks.json에서 속성을 설정하여 컨테이너의 진입점을 구성할 수 있습니다. VS Code는 Containers: Add Docker Files to Workspace... 명령을 처음 사용할 때 컨테이너 진입점을 자동으로 구성합니다.
예: Python 모듈의 진입점 구성
{
"tasks": [
{
"type": "docker-run",
"label": "docker-run: debug",
"dependsOn": ["docker-build"],
"python": {
"module": "myapp"
}
}
]
}
예: Python 파일의 진입점 구성
{
"tasks": [
{
"type": "docker-run",
"label": "docker-run: debug",
"dependsOn": ["docker-build"],
"python": {
"args": ["runserver", "0.0.0.0:8000", "--nothreading", "--noreload"],
"file": "manage.py"
}
}
]
}
애플리케이션의 진입 페이지로 브라우저 자동 시작
Containers: Python - Django 또는 Containers: Python - Flask 시작 구성을 선택하여 앱의 메인 페이지로 브라우저를 자동으로 시작할 수 있습니다. 이 기능은 기본적으로 활성화되어 있지만 launch.json에서 dockerServerReadyAction 객체를 설정하여 이 동작을 명시적으로 구성할 수 있습니다.
이 기능은 애플리케이션의 여러 측면에 따라 달라집니다.
- 애플리케이션은 **디버그 콘솔 또는 Docker 로그로 출력해야 합니다**.
- 애플리케이션은 "서버 준비됨" 메시지를 기록해야 합니다.
- 애플리케이션은 브라우징 가능한 페이지를 제공해야 합니다.
특정 서버 메시지 패턴을 기반으로 about.html 페이지를 열도록 브라우저를 시작하기 위해 dockerServerReadyAction을 사용하는 예는 다음과 같습니다.
{
"configurations": [
{
"name": "Containers: Python - Django",
"type": "docker",
"request": "launch",
"preLaunchTask": "docker-run: debug",
"python": {
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "/app"
}
],
"projectType": "django"
},
"dockerServerReadyAction": {
"action": "openExternally",
"pattern": "Starting development server at (https?://\\S+|[0-9]+)",
"uriFormat": "%s://:%s/about.html"
}
}
]
}
**참고**:
pattern속성의 정규 표현식은 단순히 "Starting development server athttps://:8000"과 유사한 기록된 메시지를 캡처하려고 시도합니다. http 또는 https, 모든 호스트 이름 및 모든 포트에 대한 URL의 변형을 수용합니다.
중요 dockerServerReadyAction 객체 속성
-
action: 패턴이 발견되었을 때 수행할 작업입니다.debugWithChrome또는openExternally가 될 수 있습니다. -
pattern: 애플리케이션이 위의 메시지와 다른 메시지를 기록하는 경우,dockerServerReadyAction객체의pattern속성을 해당 메시지와 일치하는 **JavaScript 정규 표현식**으로 설정합니다. 정규 표현식에는 애플리케이션이 수신 대기 중인 포트에 해당하는 캡처 그룹이 포함되어야 합니다. -
uriFormat: 기본적으로 Container Tools 확장 프로그램은 브라우저의 메인 페이지를 엽니다(애플리케이션에서 결정하는 방식). 위의 예와 같이 특정 페이지를 열도록 브라우저를 열고 싶다면dockerServerReadyAction객체의uriFormat속성을 프로토콜 및 포트 대체 항목을 나타내는 두 개의 문자열 토큰이 있는 형식 문자열로 설정해야 합니다.
Django 또는 Flask 앱에서 핫 리로딩 활성화 방법
Django 또는 Flask에 대해 Containers: Add Docker Files to Workspace를 선택하면 정적 배포를 위해 구성된 Dockerfile과 tasks.json을 제공합니다. 앱 코드 변경 시마다 컨테이너를 다시 빌드하고 다시 실행해야 합니다. 핫 리로딩을 통해 컨테이너가 계속 실행되는 동안 앱 코드의 변경 사항을 시각화할 수 있습니다. 다음 단계로 핫 리로딩을 활성화하세요.
Django 앱의 경우
-
Dockerfile에서 앱 코드를 컨테이너에 추가하는 줄을 주석 처리합니다.
#ADD . /app -
tasks.json파일의docker-run작업 내에서volumes속성을 가진 새dockerRun속성을 생성합니다. 이 설정은 현재 워크스페이스 폴더(앱 코드)를 컨테이너의/app폴더에 매핑합니다.{ "type": "docker-run", "label": "docker-run: debug", "dependsOn": [ "docker-build" ], "dockerRun": { "volumes": [ { "containerPath": "/app", "localPath": "${workspaceFolder}" } ] }, ... } -
--noreload및--nothreading을 **제거**하여 python 속성을 편집합니다.{ ... "dockerRun": { "volumes": [ { "containerPath": "/app", "localPath": "${workspaceFolder}" } ] }, "python": { "args": [ "runserver", "0.0.0.0:8000", ], "file": "manage.py" } } -
Containers: Python – Django 시작 구성을 선택하고 F5를 눌러 컨테이너를 빌드하고 실행합니다.
-
파일을 수정하고 저장합니다.
-
브라우저를 새로 고치고 변경 사항이 적용되었는지 확인합니다.
Flask 앱의 경우
-
Dockerfile에서 앱 코드를 컨테이너에 추가하는 줄을 주석 처리합니다.
#ADD . /app -
tasks.json파일의docker-run작업 내에서env속성에FLASK_ENV와volumes속성을 추가하여 기존 dockerRun 속성을 편집합니다. 이 설정은 현재 워크스페이스 폴더(앱 코드)를 컨테이너의/app폴더에 매핑합니다.{ "type": "docker-run", "label": "docker-run: debug", "dependsOn": [ "docker-build" ], "dockerRun": { "env": { "FLASK_APP": "path_to/flask_entry_point.py", "FLASK_ENV": "development" }, "volumes": [ { "containerPath": "/app", "localPath": "${workspaceFolder}" } ] }, ... } -
--no-reload및--no-debugger를 **제거**하여 python 속성을 편집합니다.{ ... "dockerRun": { "env": { "FLASK_APP": "path_to/flask_entry_point.py", "FLASK_ENV": "development" }, "volumes": [ { "containerPath": "/app", "localPath": "${workspaceFolder}" } ] }, "python": { "args": [ "run", "--host", "0.0.0.0", "--port", "5000" ], "module": "flask" } } -
Containers: Python – Flask 시작 구성을 선택하고 F5를 눌러 컨테이너를 빌드하고 실행합니다.
-
파일을 수정하고 저장합니다.
-
브라우저를 새로 고치고 변경 사항이 적용되었는지 확인합니다.
컨테이너를 함께 빌드하고 실행하는 방법
- 앞서 언급한
tasks.json파일에는docker-build작업에 대한 종속성이 있습니다. 이 작업은tasks.json의tasks배열의 일부입니다. 예를 들어
"tasks":
[
{
...
},
{
"label": "docker-build",
"type": "docker-build",
"dockerBuild": {
"context": "${workspaceFolder}",
"dockerfile": "${workspaceFolder}/Dockerfile",
"tag": "YOUR_IMAGE_NAME:YOUR_IMAGE_TAG"
}
}
]
**팁**: 종속성에 docker-build가 명확하게 명시되어 있으므로 이름은 이 작업과 일치해야 합니다. 원하는 경우 이름을 변경할 수 있습니다.
-
JSON의
dockerBuild객체는 다음 매개변수를 허용합니다.- context: 빌드 컨텍스트이며, 여기서 Dockerfile이 호출됩니다.
- dockerfile: 실행할 Dockerfile의 경로입니다.
- tag: 버전 태그가 있는 빌드할 이미지의 이름입니다.
-
전반적으로 Flask 애플리케이션을 빌드하고 디버깅하기 위한 VS Code 설정은 다음과 같을 수 있습니다.
-
launch.json{ "version": "0.2.0", "configurations": [ { "name": "Debug Flask App", "type": "docker", "request": "launch", "preLaunchTask": "docker-run: debug", "python": { "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "/app" } ], "projectType": "flask" }, "dockerServerReadyAction": { "action": "openExternally", "pattern": "Running on (http?://\\S+|[0-9]+)", "uriFormat": "%s://:%s/" } } ] } -
tasks.json{ "version": "2.0.0", "tasks": [ { "type": "docker-run", "label": "docker-run: debug", "dependsOn": ["docker-build"], "dockerRun": { "containerName": "YOUR_IMAGE_NAME", "image": "YOUR_IMAGE_NAME:YOUR_IMAGE_TAG", "env": { "FLASK_APP": "path_to/flask_entry_point.py", "FLASK_ENV": "development" }, "volumes": [ { "containerPath": "/app", "localPath": "${workspaceFolder}" } ], "ports": [ { "containerPort": 5000, "hostPort": 5000 } ] }, "python": { "args": ["run", "--host", "0.0.0.0", "--port", "5000"], "module": "flask" } }, { "label": "docker-build", "type": "docker-build", "dockerBuild": { "context": "${workspaceFolder}", "dockerfile": "${workspaceFolder}/Dockerfile", "tag": "YOUR_IMAGE_NAME:YOUR_IMAGE_TAG" } } ] }
-
다음 단계
더 알아보기