이 출시되었습니다! 11월의 새로운 기능 및 수정 사항을 읽어보세요.

컨테이너 내 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 at https://: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 앱의 경우

  1. Dockerfile에서 앱 코드를 컨테이너에 추가하는 줄을 주석 처리합니다.

    #ADD . /app
    
  2. tasks.json 파일의 docker-run 작업 내에서 volumes 속성을 가진 새 dockerRun 속성을 생성합니다. 이 설정은 현재 워크스페이스 폴더(앱 코드)를 컨테이너의 /app 폴더에 매핑합니다.

    {
      "type": "docker-run",
      "label": "docker-run: debug",
      "dependsOn": [
        "docker-build"
      ],
      "dockerRun": {
        "volumes": [
          {
            "containerPath": "/app", "localPath": "${workspaceFolder}"
          }
        ]
      },
      ...
    }
    
  3. --noreload--nothreading을 **제거**하여 python 속성을 편집합니다.

    {
      ...
      "dockerRun": {
        "volumes": [
          {
            "containerPath": "/app", "localPath": "${workspaceFolder}"
          }
        ]
      },
      "python": {
        "args": [
          "runserver",
          "0.0.0.0:8000",
        ],
        "file": "manage.py"
      }
    }
    
  4. Containers: Python – Django 시작 구성을 선택하고 F5를 눌러 컨테이너를 빌드하고 실행합니다.

  5. 파일을 수정하고 저장합니다.

  6. 브라우저를 새로 고치고 변경 사항이 적용되었는지 확인합니다.

Flask 앱의 경우

  1. Dockerfile에서 앱 코드를 컨테이너에 추가하는 줄을 주석 처리합니다.

    #ADD . /app
    
  2. tasks.json 파일의 docker-run 작업 내에서 env 속성에 FLASK_ENVvolumes 속성을 추가하여 기존 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}"
          }
        ]
      },
      ...
    }
    
  3. --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"
      }
    }
    
  4. Containers: Python – Flask 시작 구성을 선택하고 F5를 눌러 컨테이너를 빌드하고 실행합니다.

  5. 파일을 수정하고 저장합니다.

  6. 브라우저를 새로 고치고 변경 사항이 적용되었는지 확인합니다.

컨테이너를 함께 빌드하고 실행하는 방법

  1. 앞서 언급한 tasks.json 파일에는 docker-build 작업에 대한 종속성이 있습니다. 이 작업은 tasks.jsontasks 배열의 일부입니다. 예를 들어
"tasks":
[
  {
    ...
  },
  {
    "label": "docker-build",
    "type": "docker-build",
    "dockerBuild": {
        "context": "${workspaceFolder}",
        "dockerfile": "${workspaceFolder}/Dockerfile",
        "tag": "YOUR_IMAGE_NAME:YOUR_IMAGE_TAG"
    }
  }
]

**팁**: 종속성에 docker-build가 명확하게 명시되어 있으므로 이름은 이 작업과 일치해야 합니다. 원하는 경우 이름을 변경할 수 있습니다.

  1. JSON의 dockerBuild 객체는 다음 매개변수를 허용합니다.

    • context: 빌드 컨텍스트이며, 여기서 Dockerfile이 호출됩니다.
    • dockerfile: 실행할 Dockerfile의 경로입니다.
    • tag: 버전 태그가 있는 빌드할 이미지의 이름입니다.
  2. 전반적으로 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"
            }
          }
        ]
      }
      

다음 단계

더 알아보기

© . This site is unofficial and not affiliated with Microsoft.