Vscode-docker: 디버그 μ»¨ν…Œμ΄λ„ˆ

에 λ§Œλ“  2017λ…„ 01μ›” 28일  Β·  22μ½”λ©˜νŠΈ  Β·  좜처: microsoft/vscode-docker

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„,

이 ν™•μž₯이 μ»¨ν…Œμ΄λ„ˆμ— λŒ€ν•œ 디버깅 κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” PR을 ν—ˆμš©ν•˜λŠ”μ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€...

μ²˜μŒμ— μ•„μ΄λ””μ–΄λŠ” (μ—¬λŸ¬) μ»¨ν…Œμ΄λ„ˆμ—μ„œ ν˜ΈμŠ€νŒ…λ˜λŠ” .Net Core μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ””λ²„κ·Έν•˜λ„λ‘ ν•˜λŠ” 것이며 λ””λ²„κ±°λŠ” κ²°κ΅­ 예λ₯Ό λ“€μ–΄ node.js와 같은 λ‹€λ₯Έ μœ ν˜•μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ§€μ›ν•˜λ„λ‘ ν™•μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.

이 경우 μ²˜μŒμ—λŠ” .Net Core λΆ€λΆ„μ—μ„œ μž‘μ—…ν•˜κ³  λ‚˜μ€‘μ— λ‹€λ₯Έ 기술자λ₯Ό μœ„ν•΄ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„μ΄λ””μ–΄λŠ” μš°λ¦¬κ°€ VS2017μ—μ„œ κ²½ν—˜ν•œ 것과 μœ μ‚¬ν•œ 것을 λ§Œλ“€κ³  초기 도컀 β€‹β€‹νŒŒμΌμ„ μΆ”κ°€ν•  수 μžˆλŠ” 도컀 도ꡬ(이 ν™•μž₯은 이미 맀우 κΈ°λ³Έμ μž„)λ₯Ό λ§Œλ“€κ³  도컀(μž‘μ„±) νŒŒμΌμ—μ„œ 전체 인프라λ₯Ό λ§Œλ“  λ‹€μŒ μ²¨λΆ€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 디버거.

μ–΄λ–»κ²Œ λ“€λ¦¬λ‚˜μš”?

감사 ν•΄μš”

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ—¬λŸ¬λΆ„, 방금 docker-composeλ₯Ό 예둜 μ„€λͺ…ν–ˆμŠ΅λ‹ˆλ‹€. κ·€ν•˜μ˜ μ ‘κ·Ό 방식은 μ†”λ£¨μ…˜μ΄ μ—†κ³  μ—°κ²°ν•  단일 μ»¨ν…Œμ΄λ„ˆκ°€ μžˆλŠ” 단일 ν”„λ‘œμ νŠΈμ— μ ν•©ν•©λ‹ˆλ‹€. μ•„μ΄λ””μ–΄λŠ” F5 ν‚€λ₯Ό λˆ„λ₯΄κ³  docker-compose 파일 λ‚΄μ˜ λͺ¨λ“  μ„œλΉ„μŠ€μ— 디버거λ₯Ό μ—°κ²°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ—¬λŸ¬ 번의 μ‹œλ„μ™€ 였λ₯˜ 끝에 VSCode의 κΈ°λŠ₯ 뢀쑱을 μ–΅μ œν•˜κΈ° μœ„ν•΄ 슀크립트/해킹에 μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ” 더 λ‚˜μ€ 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ μ†”λ£¨μ…˜ μˆ˜μ€€μ˜ μƒ˜ν”Œ docker-compose.yml .

version: '3.1'

services:
  repository-api:
    image: repository-api:debug
    build:
      context: ./src/QUBIX.Repository.API/bin/PublishOutput/
      dockerfile: Dockerfile.debug
    ports: 
      - "10200:10200"
    environment: 
      - ASPNETCORE_ENVIRONMENT=Development
    volumes: 
      - ./src/QUBIX.Repository.API/bin/PublishOutput/:/app
      - ~/.nuget/packages:/root/.nuget/packages:ro
    depends_on: 
      - repository-silo
  repository-silo:
    image: repository-silo:debug
    build:
      context: ./src/QUBIX.Repository.Silo/bin/PublishOutput/
      dockerfile: Dockerfile.debug
    environment: 
      - QUBIX_REPOSITORY_MBR_CS
    volumes: 
      - ./src/QUBIX.Repository.Silo/bin/PublishOutput/:/app
      - ~/.nuget/packages:/root/.nuget/packages:ro
  repository-reader-silo:
    image: repository-reader-silo:debug
    build:
      context: ./src/QUBIX.Repository.Reader.Silo/bin/PublishOutput/
      dockerfile: Dockerfile.debug
    environment: 
      - QUBIX_REPOSITORY_READER_MBR_CS
      - QUBIX_REPOSITORY_READER_DOCDB_EP
      - QUBIX_REPOSITORY_READER_DOCDB_KEY
    volumes: 
      - ./src/QUBIX.Repository.Reader.Silo/bin/PublishOutput/:/app
      - ~/.nuget/packages:/root/.nuget/packages:ro

Dockerfile.debug .

FROM microsoft/dotnet:1.1-sdk-msbuild
ENV NUGET_XMLDOC_MODE=skip 
ARG CLRDBG_VERSION=VS2015U2
WORKDIR /clrdbg
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        unzip \
    && rm -rf /var/lib/apt/lists/* \
    && curl -SL https://raw.githubusercontent.com/Microsoft/MIEngine/getclrdbg-release/scripts/GetClrDbg.sh --output GetClrDbg.sh \
    && chmod 700 GetClrDbg.sh \
    && ./GetClrDbg.sh $CLRDBG_VERSION \
    && rm GetClrDbg.sh
WORKDIR /app
ENTRYPOINT ["tail", "-f", "/dev/null"]

μ—¬λŸ¬ μ„œλΉ„μŠ€κ°€ μžˆμ§€λ§Œ κ·Έ 쀑 μ–΄λŠ 것도 디버거 ν¬νŠΈκ°€ μ—΄λ € μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. DockerFile.debug 기본적으둜 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹œμž‘ν•˜κ³  μ§„μž…μ μ€ μ’…λ£Œ 없이 κ·ΈλŒ€λ‘œ μœ μ§€ν•©λ‹ˆλ‹€. λ˜ν•œ λ‹€μš΄λ‘œλ“œ getclrdbg.sh ν•©λ‹ˆλ‹€ (포함해야 그래, λ‚΄κ°€ κ·Έλ¬Ό 핡심 SDK λͺ¨λ‘ Windows 및 Linux μ»¨ν…Œμ΄λ„ˆλ₯Ό 생각 디버거λ₯Ό μ„€μΉ˜ν•˜λ €λ©΄ clrdbg ). λ³Όλ₯¨μ€ /app 의 ν”„λ‘œμ νŠΈ 좜λ ₯ 폴더에 λ§€ν•‘λ˜κ³  docker-compose에 μ „λ‹¬λ©λ‹ˆλ‹€.

ν•˜λ£¨μ— ν•œ 번 ν”„λ‘œμ νŠΈ μž‘μ—…μ„ μ‹œμž‘ν•  λ•Œ μ†”λ£¨μ…˜ 디렉토리와 docker-compose up -d 터미널을 μ—½λ‹ˆλ‹€. ENV vars, 이미지 λ“±κ³Ό 같이 μ»¨ν…Œμ΄λ„ˆ μžμ²΄μ—μ„œ 무언가λ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μ•„λ‹ˆλ©΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό 끌 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ 전체 μž‘μ„± ν”„λ‘œμ νŠΈκ°€ 항상 켜져 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. (처음이라면 docker-compose build λ₯Ό μ‹€ν–‰ν•˜μ—¬ 이미지λ₯Ό λΉŒλ“œν•©λ‹ˆλ‹€.)

λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ 쀑이면 μ»¨ν…Œμ΄λ„ˆλ₯Ό λ””λ²„κ·Έν•˜λ„λ‘ VSCodeλ₯Ό ꡬ성해야 ν•©λ‹ˆλ‹€.

이것은 λ‚΄ tasks.json .

{
    "version": "0.1.0",
    "isShellCommand": true,
    "command": "dotnet",
    "args":[],
    "tasks": [
        {
            "taskName": "publish",
            "args": [
                "${workspaceRoot}/QUBIX-Repository.sln", "-c", "Debug", "-o", "bin/PublishOutput"
            ],
            "isBuildCommand": true,
            "problemMatcher": "$msCompile"
        }
    ]
}

build λŒ€μ‹  publish μžˆμŠ΅λ‹ˆλ‹€. κ·Έ μ΄μœ λŠ” .Net Core λΉŒλ“œκ°€ λͺ¨λ“  쒅속성을 좜λ ₯ 폴더에 넣지 μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ”°λΌμ„œ clrdbg μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œλŠ” μš”μ²­ μ‹œ 참쑰된 μ–΄μ…ˆλΈ”λ¦¬λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.

이제 이것은 λ‚΄ launch.json .

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Repository-Silo",
            "type": "coreclr",
            "request": "launch",
            "cwd": "/app",
            "program": "/app/QUBIX.Repository.Silo.dll",
            "sourceFileMap": {
                "/app": "${workspaceRoot}/src/QUBIX.Repository.Silo"
            },
            "pipeTransport": {
                "pipeProgram": "/bin/bash",
                "pipeCwd": "${workspaceRoot}",
                "pipeArgs": [
                    "-c",
                    "docker exec -i qubixrepository_repository-silo_1 /clrdbg/clrdbg --interpreter=mi"
                ]
            }
        },
        {
            "name": "Repository-API",
            "type": "coreclr",
            "request": "launch",
            "cwd": "/app",
            "program": "/app/QUBIX.Repository.API.dll",
            "sourceFileMap": {
                "/app": "${workspaceRoot}/src/QUBIX.Repository.API"
            },
            "pipeTransport": {
                "pipeProgram": "/bin/bash",
                "pipeCwd": "${workspaceRoot}",
                "pipeArgs": [
                    "-c",
                    "docker exec -i qubixrepository_repository-api_1 /clrdbg/clrdbg --interpreter=mi"
                ]
            }
        },
        {
            "name": "Repository-Reader-Silo",
            "type": "coreclr",
            "request": "launch",
            "cwd": "/app",
            "program": "/app/QUBIX.Repository.Reader.Silo.dll",
            "sourceFileMap": {
                "/app": "${workspaceRoot}/src/QUBIX.Repository.Reader.Silo"
            },
            "pipeTransport": {
                "pipeProgram": "/bin/bash",
                "pipeCwd": "${workspaceRoot}",
                "pipeArgs": [
                    "-c",
                    "docker exec -i qubixrepository_repository-reader-silo_1 /clrdbg/clrdbg --interpreter=mi"
                ]
            }
        },
        {
            "name": "Repository-Reader-API",
            "type": "coreclr",
            "request": "launch",
            "cwd": "/app",
            "program": "/app/QUBIX.Repository.Reader.API.dll",
            "sourceFileMap": {
                "/app": "${workspaceRoot}/src/QUBIX.Repository.Reader.API"
            },
            "pipeTransport": {
                "pipeProgram": "/bin/bash",
                "pipeCwd": "${workspaceRoot}",
                "pipeArgs": [
                    "-c",
                    "docker exec -i qubixrepository_repository-reader-api_1 /clrdbg/clrdbg --interpreter=mi"
                ]
            }
        }
    ]
}

μ§€κΈˆ μ—¬κΈ°μ—μ„œ 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? publishOutput이 μ»¨ν…Œμ΄λ„ˆμ˜ /app 에 λ§€ν•‘λœλ‹€λŠ” 것을 κΈ°μ–΅ν•˜μ‹­λ‹ˆκΉŒ? λ”°λΌμ„œ docker-compose.yml 에 μžˆλŠ” 각 μ„œλΉ„μŠ€/ν”„λ‘œμ νŠΈμ— λŒ€ν•΄ μ‹œμž‘ ꡬ성이 μžˆμŠ΅λ‹ˆλ‹€. 이 μ‹œμž‘ ꡬ성이 ν•˜λŠ” 일은 docker exec λ₯Ό ν•΄λ‹Ή μ„œλΉ„μŠ€μ˜ μ»¨ν…Œμ΄λ„ˆλ‘œ ν˜ΈμΆœν•˜κ³  clrdbg ν˜ΈμΆœν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ˜ 원격 디버거와 디버거가 될 μ• ν”Œλ¦¬μΌ€μ΄μ…˜( /app 맀핑됨)을 μ‹œμž‘ν•˜κ³  μ»΄ν“¨ν„°μ—μ„œ .Net Core 디버거λ₯Ό λ§Œλ“€μ–΄ 여기에 μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. dll은 디버거 내뢀에 μ›κ²©μœΌλ‘œ 배포되기 λ•Œλ¬Έμ— μ†ŒμŠ€ 맡 λ§€κ°œλ³€μˆ˜λŠ” μ†ŒμŠ€κ°€ 어디에 μžˆλŠ”μ§€ 디버거에 μ•Œλ €μ€λ‹ˆλ‹€.

이런 μ‹μœΌλ‘œ 디버거 μ„Έμ…˜μ—μ„œ 쀑지λ₯Ό λˆ„λ₯΄λ©΄ μ’…λ£Œλ˜λŠ” λͺ…령은 전체 μ»¨ν…Œμ΄λ„ˆ μžμ²΄κ°€ μ•„λ‹ˆλΌ 원격 디버거와 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹œμž‘ν•œ docker exec μž…λ‹ˆλ‹€. F5 ν‚€λ₯Ό λˆ„λ₯Ό λ•Œλ§ˆλ‹€ μ»¨ν…Œμ΄λ„ˆλ₯Ό 계속 λ‹€μ‹œ λΉŒλ“œν•˜λŠ” 것보닀 훨씬 λΉ λ₯΄κ²Œ λ°˜λ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

_μ™ΈλΆ€ μŠ€ν¬λ¦½νŠΈλ‚˜ ν™•μž₯ κΈ°λŠ₯이 μ „ν˜€ μ—†λ‹€λŠ” 점에 μœ μ˜ν•˜μ„Έμš”. VSCode, C# ν™•μž₯ 및 Docker μ„€μΉ˜λ§Œ 있으면 λ©λ‹ˆλ‹€._

μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€! πŸ’ƒ:배솑:

이제 단점 😞

  1. μ‹œμž‘ κ΅¬μ„±μ—μ„œ docker exec λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλΉ„μŠ€ λ‚΄μ˜ νŠΉμ • μ»¨ν…Œμ΄λ„ˆλ₯Ό 직접 λŒ€μƒμœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€(예 qubixrepository_repository-reader-api_1 λ§ˆμ§€λ§‰ ν•­λͺ©μ˜
  2. ꡬ성을 두 개 μ΄μƒμ˜ μΈμŠ€ν„΄μŠ€λ‘œ ν™•μž₯ν•˜κ³  λ™μΌν•œ μ„œλΉ„μŠ€μ˜ μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€λ₯Ό 디버그할 수 μ—†μŠ΅λ‹ˆλ‹€.
  3. F5 ν‚€λ₯Ό λˆ„λ₯΄κ³  λͺ¨λ“  μ„œλΉ„μŠ€μ— 디버거λ₯Ό μ—°κ²°ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. VSCode 디버거 μ„Ήμ…˜μ—μ„œ ν•˜λ‚˜μ”© μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€. ( compound μ‹œμž‘ ꡬ성은 μž‘λ™ν•˜μ§€ μ•ŠμœΌλ©° μž‘λ™ν•˜λ”λΌλ„ docker-compose 쒅속성 체인을 μ„ μ–Έν•˜λŠ” depends_on λ₯Ό μ‘΄μ€‘ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€κ°€ μ‹œμž‘λ˜κΈ° 전에 μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 쒅속성).
  4. docker-composeλ₯Ό 사전 μ‹€ν–‰ μž‘μ—…μœΌλ‘œ μ‚¬μš©ν•˜κ³  λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€μ™€ 디버거 κ²½ν—˜μ„ 많이 느리게 ν•˜μ—¬ μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€.

μ›ν•˜λŠ” κ²½ν—˜:

  1. docker-compose.yml νŒŒμΌμ„ λ§Œλ“€κ³  ν‰μ†Œμ™€ 같이 이미지와 μ„œλΉ„μŠ€λ₯Ό μ„€λͺ…ν•©λ‹ˆλ‹€.
  2. F5 ν‚€λ₯Ό 눌러 ν”„λ‘œμ νŠΈ μ‹€ν–‰
  3. dotnet build λŠ” μ†”λ£¨μ…˜ μˆ˜μ€€μ—μ„œ λ°œμƒ
  4. docker-compose μ—…λ°μ΄νŠΈκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κ³  μ—…λ°μ΄νŠΈκ°€ μ—†κ³  μ„œλΉ„μŠ€κ°€ μ‹€ν–‰ 쀑이면 λ¬΄μ‹œν•˜κ³  μ‹€ν–‰ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€. 그렇지 μ•ŠμœΌλ©΄ docker-compose build 및 docker-compose up κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  5. docker-compose ps λŠ” κ΅¬μ„±λœ λͺ¨λ“  ν”„λ‘œμ νŠΈμ˜ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλ₯Ό κ°€μ Έμ˜€κ³  각 ν”„λ‘œμ νŠΈμ— 디버거λ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€.
  6. VSCodeμ—μ„œ 디버거λ₯Ό μ€‘μ§€ν•˜λ©΄ 원격 디버거 ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ˜μ§€λ§Œ μ»¨ν…Œμ΄λ„ˆλŠ” 계속 μ‹€ν–‰λ©λ‹ˆλ‹€.
  7. 디버그 μ„Έμ…˜μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆ(예: qubixrepository_repository-reader-api_1, qubixrepository_repository-reader-api_2, qubixrepository_repository-reader-api_N)μ—μ„œ λ™μΌν•œ ν”„λ‘œμ νŠΈμ— λŒ€ν•œ 디버거λ₯Ό μ—¬λŸ¬ 번 μ—°κ²°ν•  수 μžˆμœΌλ―€λ‘œ λΆ„μ‚° μ‘μš© ν”„λ‘œκ·Έλž¨μ„ 디버그할 수 μžˆμŠ΅λ‹ˆλ‹€.

말이 λ˜λ‚˜μš” μ—¬λŸ¬λΆ„? μš°λ¦¬λŠ” μ–΄λ–»κ²Œ κ·Έ κ²½ν—˜μ„ 달성할 수 μžˆμŠ΅λ‹ˆκΉŒ?

감사 ν•΄μš”!

λͺ¨λ“  22 λŒ“κΈ€

@galvesribeiro PR은 μ–Έμ œλ‚˜ ν™˜μ˜μž…λ‹ˆλ‹€! μ €λŠ” VS2017 κ²½ν—˜μ— μ΅μˆ™ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 이 ν™•μž₯ κΈ°λŠ₯을 κ°œμ„ ν•˜λŠ” 방법에 λŒ€ν•œ ν”Όλ“œλ°±/생각은 ꡉμž₯ν•  κ²ƒμž…λ‹ˆλ‹€.

@lostintangentλ‹˜ , λΉ λ₯Έ λ‹΅λ³€ κ°μ‚¬ν•©λ‹ˆλ‹€.

이 κ²Œμ‹œλ¬Όμ„ μ‚΄νŽ΄λ³΄μ‹­μ‹œμ˜€ https://blogs.msdn.microsoft.com/webdev/2016/11/16/new-docker-tools-for-visual-studio/

Visual Studioμ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ λ³΄μ—¬μ€λ‹ˆλ‹€. 기본적으둜 ν”„λ‘œμ νŠΈ λ˜λŠ” μ†”λ£¨μ…˜μ„ 마우슀 였λ₯Έμͺ½ λ²„νŠΌμœΌλ‘œ ν΄λ¦­ν•˜κ³  Docker 지원을 μΆ”κ°€ν•©λ‹ˆλ‹€. μΆ”κ°€λ˜λ©΄ F5 ν‚€λ₯Ό λˆ„λ₯΄κΈ°λ§Œ ν•˜λ©΄ λͺ¨λ“  "λ§ˆλ²•"이 λ°œμƒν•˜κ³  λŒ€μƒ μ»¨ν…Œμ΄λ„ˆμ— 디버거가 μ—°κ²°λ©λ‹ˆλ‹€. VS2017μ—μ„œλŠ” docker-compose μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ μ‹€ν–‰λ˜λŠ” μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ„ μ§€μ›ν•˜λ―€λ‘œ λ™μΌν•œ μž‘μ„± 파일의 μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆ 뢀뢄을 λ™μ‹œμ— 디버그할 수 μžˆμŠ΅λ‹ˆλ‹€...

λ…Έλ“œμ˜ 경우 ν™•μž₯은 μ‚¬μ΄νŠΈ 및 디버거 포트λ₯Ό λͺ¨λ‘ μ—΄κ³  디버그 μŠ€μœ„μΉ˜λ‘œ λ…Έλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” docker-compose.debug.yml νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€. 사전 μ‹€ν–‰ μž‘μ—…μœΌλ‘œ yml νŒŒμΌμ—μ„œ docker-compose up을 μ‹€ν–‰ν•˜μ—¬ 디버그 ν”„λ‘œμ„ΈμŠ€λ₯Ό μžλ™ν™”ν•  수 있으며 그러면 VS Codeκ°€ 이에 μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

C#의 경우 λ™μΌν•œ νŒ¨ν„΄μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ˜¬λ°”λ₯Έ μž‘μ—… 파일인 docker-compose.debug.yml을 μƒμ„±ν•œ λ‹€μŒ launch.json에 μ—°κ²°ν•©λ‹ˆλ‹€.

@lostintangent μ—¬κΈ°μ—μ„œ λ‚΄ μ €μž₯μ†Œλ₯Ό λ³΄μ‹­μ‹œμ˜€: https://github.com/spboyer/dockerdebugapp
μ—¬κΈ°μ—λŠ” κΈ°λ³Έ 이미지와 μ μ ˆν•œ 디버그 μž‘μ„± 이미지가 μžˆμ–΄ 디버거λ₯Ό VS Code에 μ—°κ²°ν•©λ‹ˆλ‹€. .NET Core용으둜 μ΄λŸ¬ν•œ νŒŒμΌμ„ μƒμ„±ν•˜λ €λ©΄ ν™•μž₯을 λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ‹œμ›ν•œ!

μ—¬λŸ¬λΆ„, 방금 docker-composeλ₯Ό 예둜 μ„€λͺ…ν–ˆμŠ΅λ‹ˆλ‹€. κ·€ν•˜μ˜ μ ‘κ·Ό 방식은 μ†”λ£¨μ…˜μ΄ μ—†κ³  μ—°κ²°ν•  단일 μ»¨ν…Œμ΄λ„ˆκ°€ μžˆλŠ” 단일 ν”„λ‘œμ νŠΈμ— μ ν•©ν•©λ‹ˆλ‹€. μ•„μ΄λ””μ–΄λŠ” F5 ν‚€λ₯Ό λˆ„λ₯΄κ³  docker-compose 파일 λ‚΄μ˜ λͺ¨λ“  μ„œλΉ„μŠ€μ— 디버거λ₯Ό μ—°κ²°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ—¬λŸ¬ 번의 μ‹œλ„μ™€ 였λ₯˜ 끝에 VSCode의 κΈ°λŠ₯ 뢀쑱을 μ–΅μ œν•˜κΈ° μœ„ν•΄ 슀크립트/해킹에 μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ” 더 λ‚˜μ€ 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ μ†”λ£¨μ…˜ μˆ˜μ€€μ˜ μƒ˜ν”Œ docker-compose.yml .

version: '3.1'

services:
  repository-api:
    image: repository-api:debug
    build:
      context: ./src/QUBIX.Repository.API/bin/PublishOutput/
      dockerfile: Dockerfile.debug
    ports: 
      - "10200:10200"
    environment: 
      - ASPNETCORE_ENVIRONMENT=Development
    volumes: 
      - ./src/QUBIX.Repository.API/bin/PublishOutput/:/app
      - ~/.nuget/packages:/root/.nuget/packages:ro
    depends_on: 
      - repository-silo
  repository-silo:
    image: repository-silo:debug
    build:
      context: ./src/QUBIX.Repository.Silo/bin/PublishOutput/
      dockerfile: Dockerfile.debug
    environment: 
      - QUBIX_REPOSITORY_MBR_CS
    volumes: 
      - ./src/QUBIX.Repository.Silo/bin/PublishOutput/:/app
      - ~/.nuget/packages:/root/.nuget/packages:ro
  repository-reader-silo:
    image: repository-reader-silo:debug
    build:
      context: ./src/QUBIX.Repository.Reader.Silo/bin/PublishOutput/
      dockerfile: Dockerfile.debug
    environment: 
      - QUBIX_REPOSITORY_READER_MBR_CS
      - QUBIX_REPOSITORY_READER_DOCDB_EP
      - QUBIX_REPOSITORY_READER_DOCDB_KEY
    volumes: 
      - ./src/QUBIX.Repository.Reader.Silo/bin/PublishOutput/:/app
      - ~/.nuget/packages:/root/.nuget/packages:ro

Dockerfile.debug .

FROM microsoft/dotnet:1.1-sdk-msbuild
ENV NUGET_XMLDOC_MODE=skip 
ARG CLRDBG_VERSION=VS2015U2
WORKDIR /clrdbg
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        unzip \
    && rm -rf /var/lib/apt/lists/* \
    && curl -SL https://raw.githubusercontent.com/Microsoft/MIEngine/getclrdbg-release/scripts/GetClrDbg.sh --output GetClrDbg.sh \
    && chmod 700 GetClrDbg.sh \
    && ./GetClrDbg.sh $CLRDBG_VERSION \
    && rm GetClrDbg.sh
WORKDIR /app
ENTRYPOINT ["tail", "-f", "/dev/null"]

μ—¬λŸ¬ μ„œλΉ„μŠ€κ°€ μžˆμ§€λ§Œ κ·Έ 쀑 μ–΄λŠ 것도 디버거 ν¬νŠΈκ°€ μ—΄λ € μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. DockerFile.debug 기본적으둜 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹œμž‘ν•˜κ³  μ§„μž…μ μ€ μ’…λ£Œ 없이 κ·ΈλŒ€λ‘œ μœ μ§€ν•©λ‹ˆλ‹€. λ˜ν•œ λ‹€μš΄λ‘œλ“œ getclrdbg.sh ν•©λ‹ˆλ‹€ (포함해야 그래, λ‚΄κ°€ κ·Έλ¬Ό 핡심 SDK λͺ¨λ‘ Windows 및 Linux μ»¨ν…Œμ΄λ„ˆλ₯Ό 생각 디버거λ₯Ό μ„€μΉ˜ν•˜λ €λ©΄ clrdbg ). λ³Όλ₯¨μ€ /app 의 ν”„λ‘œμ νŠΈ 좜λ ₯ 폴더에 λ§€ν•‘λ˜κ³  docker-compose에 μ „λ‹¬λ©λ‹ˆλ‹€.

ν•˜λ£¨μ— ν•œ 번 ν”„λ‘œμ νŠΈ μž‘μ—…μ„ μ‹œμž‘ν•  λ•Œ μ†”λ£¨μ…˜ 디렉토리와 docker-compose up -d 터미널을 μ—½λ‹ˆλ‹€. ENV vars, 이미지 λ“±κ³Ό 같이 μ»¨ν…Œμ΄λ„ˆ μžμ²΄μ—μ„œ 무언가λ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μ•„λ‹ˆλ©΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό 끌 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ 전체 μž‘μ„± ν”„λ‘œμ νŠΈκ°€ 항상 켜져 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. (처음이라면 docker-compose build λ₯Ό μ‹€ν–‰ν•˜μ—¬ 이미지λ₯Ό λΉŒλ“œν•©λ‹ˆλ‹€.)

λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ 쀑이면 μ»¨ν…Œμ΄λ„ˆλ₯Ό λ””λ²„κ·Έν•˜λ„λ‘ VSCodeλ₯Ό ꡬ성해야 ν•©λ‹ˆλ‹€.

이것은 λ‚΄ tasks.json .

{
    "version": "0.1.0",
    "isShellCommand": true,
    "command": "dotnet",
    "args":[],
    "tasks": [
        {
            "taskName": "publish",
            "args": [
                "${workspaceRoot}/QUBIX-Repository.sln", "-c", "Debug", "-o", "bin/PublishOutput"
            ],
            "isBuildCommand": true,
            "problemMatcher": "$msCompile"
        }
    ]
}

build λŒ€μ‹  publish μžˆμŠ΅λ‹ˆλ‹€. κ·Έ μ΄μœ λŠ” .Net Core λΉŒλ“œκ°€ λͺ¨λ“  쒅속성을 좜λ ₯ 폴더에 넣지 μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ”°λΌμ„œ clrdbg μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œλŠ” μš”μ²­ μ‹œ 참쑰된 μ–΄μ…ˆλΈ”λ¦¬λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.

이제 이것은 λ‚΄ launch.json .

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Repository-Silo",
            "type": "coreclr",
            "request": "launch",
            "cwd": "/app",
            "program": "/app/QUBIX.Repository.Silo.dll",
            "sourceFileMap": {
                "/app": "${workspaceRoot}/src/QUBIX.Repository.Silo"
            },
            "pipeTransport": {
                "pipeProgram": "/bin/bash",
                "pipeCwd": "${workspaceRoot}",
                "pipeArgs": [
                    "-c",
                    "docker exec -i qubixrepository_repository-silo_1 /clrdbg/clrdbg --interpreter=mi"
                ]
            }
        },
        {
            "name": "Repository-API",
            "type": "coreclr",
            "request": "launch",
            "cwd": "/app",
            "program": "/app/QUBIX.Repository.API.dll",
            "sourceFileMap": {
                "/app": "${workspaceRoot}/src/QUBIX.Repository.API"
            },
            "pipeTransport": {
                "pipeProgram": "/bin/bash",
                "pipeCwd": "${workspaceRoot}",
                "pipeArgs": [
                    "-c",
                    "docker exec -i qubixrepository_repository-api_1 /clrdbg/clrdbg --interpreter=mi"
                ]
            }
        },
        {
            "name": "Repository-Reader-Silo",
            "type": "coreclr",
            "request": "launch",
            "cwd": "/app",
            "program": "/app/QUBIX.Repository.Reader.Silo.dll",
            "sourceFileMap": {
                "/app": "${workspaceRoot}/src/QUBIX.Repository.Reader.Silo"
            },
            "pipeTransport": {
                "pipeProgram": "/bin/bash",
                "pipeCwd": "${workspaceRoot}",
                "pipeArgs": [
                    "-c",
                    "docker exec -i qubixrepository_repository-reader-silo_1 /clrdbg/clrdbg --interpreter=mi"
                ]
            }
        },
        {
            "name": "Repository-Reader-API",
            "type": "coreclr",
            "request": "launch",
            "cwd": "/app",
            "program": "/app/QUBIX.Repository.Reader.API.dll",
            "sourceFileMap": {
                "/app": "${workspaceRoot}/src/QUBIX.Repository.Reader.API"
            },
            "pipeTransport": {
                "pipeProgram": "/bin/bash",
                "pipeCwd": "${workspaceRoot}",
                "pipeArgs": [
                    "-c",
                    "docker exec -i qubixrepository_repository-reader-api_1 /clrdbg/clrdbg --interpreter=mi"
                ]
            }
        }
    ]
}

μ§€κΈˆ μ—¬κΈ°μ—μ„œ 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? publishOutput이 μ»¨ν…Œμ΄λ„ˆμ˜ /app 에 λ§€ν•‘λœλ‹€λŠ” 것을 κΈ°μ–΅ν•˜μ‹­λ‹ˆκΉŒ? λ”°λΌμ„œ docker-compose.yml 에 μžˆλŠ” 각 μ„œλΉ„μŠ€/ν”„λ‘œμ νŠΈμ— λŒ€ν•΄ μ‹œμž‘ ꡬ성이 μžˆμŠ΅λ‹ˆλ‹€. 이 μ‹œμž‘ ꡬ성이 ν•˜λŠ” 일은 docker exec λ₯Ό ν•΄λ‹Ή μ„œλΉ„μŠ€μ˜ μ»¨ν…Œμ΄λ„ˆλ‘œ ν˜ΈμΆœν•˜κ³  clrdbg ν˜ΈμΆœν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ˜ 원격 디버거와 디버거가 될 μ• ν”Œλ¦¬μΌ€μ΄μ…˜( /app 맀핑됨)을 μ‹œμž‘ν•˜κ³  μ»΄ν“¨ν„°μ—μ„œ .Net Core 디버거λ₯Ό λ§Œλ“€μ–΄ 여기에 μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. dll은 디버거 내뢀에 μ›κ²©μœΌλ‘œ 배포되기 λ•Œλ¬Έμ— μ†ŒμŠ€ 맡 λ§€κ°œλ³€μˆ˜λŠ” μ†ŒμŠ€κ°€ 어디에 μžˆλŠ”μ§€ 디버거에 μ•Œλ €μ€λ‹ˆλ‹€.

이런 μ‹μœΌλ‘œ 디버거 μ„Έμ…˜μ—μ„œ 쀑지λ₯Ό λˆ„λ₯΄λ©΄ μ’…λ£Œλ˜λŠ” λͺ…령은 전체 μ»¨ν…Œμ΄λ„ˆ μžμ²΄κ°€ μ•„λ‹ˆλΌ 원격 디버거와 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹œμž‘ν•œ docker exec μž…λ‹ˆλ‹€. F5 ν‚€λ₯Ό λˆ„λ₯Ό λ•Œλ§ˆλ‹€ μ»¨ν…Œμ΄λ„ˆλ₯Ό 계속 λ‹€μ‹œ λΉŒλ“œν•˜λŠ” 것보닀 훨씬 λΉ λ₯΄κ²Œ λ°˜λ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

_μ™ΈλΆ€ μŠ€ν¬λ¦½νŠΈλ‚˜ ν™•μž₯ κΈ°λŠ₯이 μ „ν˜€ μ—†λ‹€λŠ” 점에 μœ μ˜ν•˜μ„Έμš”. VSCode, C# ν™•μž₯ 및 Docker μ„€μΉ˜λ§Œ 있으면 λ©λ‹ˆλ‹€._

μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€! πŸ’ƒ:배솑:

이제 단점 😞

  1. μ‹œμž‘ κ΅¬μ„±μ—μ„œ docker exec λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλΉ„μŠ€ λ‚΄μ˜ νŠΉμ • μ»¨ν…Œμ΄λ„ˆλ₯Ό 직접 λŒ€μƒμœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€(예 qubixrepository_repository-reader-api_1 λ§ˆμ§€λ§‰ ν•­λͺ©μ˜
  2. ꡬ성을 두 개 μ΄μƒμ˜ μΈμŠ€ν„΄μŠ€λ‘œ ν™•μž₯ν•˜κ³  λ™μΌν•œ μ„œλΉ„μŠ€μ˜ μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€λ₯Ό 디버그할 수 μ—†μŠ΅λ‹ˆλ‹€.
  3. F5 ν‚€λ₯Ό λˆ„λ₯΄κ³  λͺ¨λ“  μ„œλΉ„μŠ€μ— 디버거λ₯Ό μ—°κ²°ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. VSCode 디버거 μ„Ήμ…˜μ—μ„œ ν•˜λ‚˜μ”© μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€. ( compound μ‹œμž‘ ꡬ성은 μž‘λ™ν•˜μ§€ μ•ŠμœΌλ©° μž‘λ™ν•˜λ”λΌλ„ docker-compose 쒅속성 체인을 μ„ μ–Έν•˜λŠ” depends_on λ₯Ό μ‘΄μ€‘ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€κ°€ μ‹œμž‘λ˜κΈ° 전에 μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 쒅속성).
  4. docker-composeλ₯Ό 사전 μ‹€ν–‰ μž‘μ—…μœΌλ‘œ μ‚¬μš©ν•˜κ³  λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€μ™€ 디버거 κ²½ν—˜μ„ 많이 느리게 ν•˜μ—¬ μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€.

μ›ν•˜λŠ” κ²½ν—˜:

  1. docker-compose.yml νŒŒμΌμ„ λ§Œλ“€κ³  ν‰μ†Œμ™€ 같이 이미지와 μ„œλΉ„μŠ€λ₯Ό μ„€λͺ…ν•©λ‹ˆλ‹€.
  2. F5 ν‚€λ₯Ό 눌러 ν”„λ‘œμ νŠΈ μ‹€ν–‰
  3. dotnet build λŠ” μ†”λ£¨μ…˜ μˆ˜μ€€μ—μ„œ λ°œμƒ
  4. docker-compose μ—…λ°μ΄νŠΈκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κ³  μ—…λ°μ΄νŠΈκ°€ μ—†κ³  μ„œλΉ„μŠ€κ°€ μ‹€ν–‰ 쀑이면 λ¬΄μ‹œν•˜κ³  μ‹€ν–‰ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€. 그렇지 μ•ŠμœΌλ©΄ docker-compose build 및 docker-compose up κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  5. docker-compose ps λŠ” κ΅¬μ„±λœ λͺ¨λ“  ν”„λ‘œμ νŠΈμ˜ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλ₯Ό κ°€μ Έμ˜€κ³  각 ν”„λ‘œμ νŠΈμ— 디버거λ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€.
  6. VSCodeμ—μ„œ 디버거λ₯Ό μ€‘μ§€ν•˜λ©΄ 원격 디버거 ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ˜μ§€λ§Œ μ»¨ν…Œμ΄λ„ˆλŠ” 계속 μ‹€ν–‰λ©λ‹ˆλ‹€.
  7. 디버그 μ„Έμ…˜μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆ(예: qubixrepository_repository-reader-api_1, qubixrepository_repository-reader-api_2, qubixrepository_repository-reader-api_N)μ—μ„œ λ™μΌν•œ ν”„λ‘œμ νŠΈμ— λŒ€ν•œ 디버거λ₯Ό μ—¬λŸ¬ 번 μ—°κ²°ν•  수 μžˆμœΌλ―€λ‘œ λΆ„μ‚° μ‘μš© ν”„λ‘œκ·Έλž¨μ„ 디버그할 수 μžˆμŠ΅λ‹ˆλ‹€.

말이 λ˜λ‚˜μš” μ—¬λŸ¬λΆ„? μš°λ¦¬λŠ” μ–΄λ–»κ²Œ κ·Έ κ²½ν—˜μ„ 달성할 수 μžˆμŠ΅λ‹ˆκΉŒ?

감사 ν•΄μš”!

@galvesribeiro
닀쀑 μ„œλΉ„μŠ€ 디버깅에 맀우 μœ μš©ν•©λ‹ˆλ‹€. 예제 μ½”λ“œκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

@Shawn-Fan 닀쀑 μ„œλΉ„μŠ€λŠ” λΆˆν–‰νžˆλ„ 기본적으둜 λ””λ²„κ±°μ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠλŠ” κ²ƒμž…λ‹ˆλ‹€. λ™μΌν•œ μ„œλΉ„μŠ€μ˜ 닀쀑 μΈμŠ€ν„΄μŠ€λ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€(μ§„μ •μœΌλ‘œ λΆ„μ‚°λœ μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ 맀우 μœ μš©ν•¨).

이 문제의 λ‚΄ 단계λ₯Ό λ”°λ₯΄λ©΄ docker-compose up -d μ—μ„œ λͺ¨λ“  디버그 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹œμž‘ν•œ λ‹€μŒ 각 μ„œλΉ„μŠ€μ— λŒ€ν•΄ VS의 디버그 μ„Ήμ…˜μ—μ„œ 각 디버거λ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” μ—¬μ „νžˆ MSFTλ₯Ό μ‚¬μš©ν•˜μ—¬ μ¦‰μ‹œ μ‚¬μš© κ°€λŠ₯ν•œ μ—¬λŸ¬ μ„œλΉ„μŠ€μ™€ μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€μ— 디버거λ₯Ό μ—°κ²°ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ‚΄κ°€ ν•œ 것은 디버거 μ œν•œμ„ ν•΄κ²°ν•˜κΈ° μœ„ν•œ ν•΄ν‚Ήμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

@galvesribeiro
λ§Žμ€ 도움을 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λŠ¦κ²ŒλΌλ„ κ°€λ³Όκ²Œ......
Windows용 VS 2017은 κ½€ 잘 μž‘λ™ν•˜μ§€λ§Œ Macμ—μ„œ Visual Studio μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ Dockerμ—μ„œ μž‘μ—…ν•˜λ €κ³  ν•©λ‹ˆλ‹€(Mac용 Visual StudioλŠ” VS 2017μ—μ„œ 잘 μž‘λ™ν•˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€).

VS2017κ³Ό Mac용 VS λͺ¨λ‘ Docker 디버깅 κ²½ν—˜κ³Ό κ΄€λ ¨ν•˜μ—¬ VSCode와 λ™μΌν•œ μ œν•œμ΄ μžˆμŠ΅λ‹ˆλ‹€...

λ¨Όμ € μ—¬κΈ°μ—μ„œ κ³΅μœ ν•œ μžμ„Έν•œ 정보에 λŒ€ν•΄ @galvesribeiro μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 정말 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

vscodeμ—μ„œ aspnetcore 2.0을 λ””λ²„κ·Έν•˜λ €λŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄ Dockerfile + launch.json을 μ•½κ°„λ§Œ μˆ˜μ •ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

  1. FROM을 microsoft/aspnetcore- build:1.0-2.0으둜 λ³€κ²½ν•©λ‹ˆλ‹€(λ‚΄ μ•± λ•Œλ¬Έμ— 2λ₯Ό μ‚¬μš©ν•  수 있음).
  2. clrdbg λŒ€μ‹  vsdbgλ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. μ΅œμ‹  C# ν™•μž₯μ—μ„œλŠ” crl이 더 이상 μ§€μ›λ˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 이에 λŒ€ν•œ μžμ„Έν•œ μ •λ³΄λŠ” 이 Dockerfile.debug λ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.
  3. point#2 λ•Œλ¬Έμ— launch.json이 μ•½κ°„ λ³€κ²½λ˜μ—ˆκ³  κ²Œμ‹œλ₯Ό μœ„ν•œ preLaunchTask도 ν¬ν•¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ€‘μš”: <> μ‚¬μ΄μ˜ λͺ¨λ“  ν•­λͺ©μ€ μ•±μ˜ λ°μ΄ν„°λ‘œ μ±„μ›Œμ•Ό ν•©λ‹ˆλ‹€.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "<Just_Another_Name_For_Your_Launch_Conf>",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "publish",
            "cwd": "/app",
            "program": "/app/<Your_AppName_Here>.dll",
            "sourceFileMap": {
                "/app": "${workspaceRoot}/<your_project_folder_here>"
            },
            "pipeTransport": {
                "pipeProgram": "docker",
                "pipeCwd": "${workspaceRoot}",
                "pipeArgs": [
                    "exec -i <your_containername_here>"
                ],
                "quoteArgs": false,
                "debuggerPath": "/vsdbg/vsdbg"
            }
        }
    ]
}

즐거운 디버깅!

@galvesribeiro - ν›Œλ₯­ν•œ μž‘μ—…, κ³΅μœ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. μš°μ—°νžˆ μ„œλΉ„μŠ€ ν”„λ‘œμ νŠΈ 쀑 ν•˜λ‚˜μ˜ 예제 Dockerfile이 μžˆμŠ΅λ‹ˆκΉŒ? μ €μž₯μ†Œ API

감사 ν•΄μš”
ν‘œμ‹œ

@mmacneil κ°μ‚¬ν•©λ‹ˆλ‹€. 디버그 μ΄λ―Έμ§€λŠ” 여기에 κ²Œμ‹œν•œ μ΄λ―Έμ§€μž…λ‹ˆλ‹€. λŸ°νƒ€μž„ μ΄λ―Έμ§€λŠ” 본질적으둜 microsoft/dotnet λŸ°νƒ€μž„ μ „μš© μ΄λ―Έμ§€μ—μ„œ μƒμ†λœ 빈 이미지이며 μ§„μž…μ μ€ 멋진 ν•­λͺ© 없이 dotnet myProject.dll μž…λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€ @galvesribeiro , 그것은 μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λ‹€λ₯Έ κ³³μ—μ„œ μ–ΈκΈ‰ν•œ κ²ƒμ²˜λŸΌ Dockerfile.debug와 λŸ°νƒ€μž„ 이미지λ₯Ό λ³‘ν•©ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν–ˆμ§€λ§Œ 이 경우 디버그 및 λŸ°νƒ€μž„μ„ μœ„ν•œ 2개의 별도 μ»¨ν…Œμ΄λ„ˆκ°€ μžˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

500(단일 ν”„λ‘œμ νŠΈ) ASP.NET .NET Core 디버깅에 λŒ€ν•œ 미리 보기 지원이 μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€(a la VS). 이것이 당신이 μ›ν•˜λŠ” 것에 더 κ°€κΉŒμ›Œμ§€κ³ , 더 μ€‘μš”ν•˜κ²ŒλŠ”, 그렇지 μ•Šλ‹€λ©΄ λ‹€λ₯Έ 무엇이 ν•„μš”ν•œμ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

@philiphoff κ°€

@galvesribeiro μ£„μ†‘ν•©λ‹ˆλ‹€. μ œκ°€ 쑰금 μ•žμ„œκ°„ 것 κ°™μŠ΅λ‹ˆλ‹€. PR이 master λ³‘ν•©λ˜μ—ˆμ§€λ§Œ 아직 λ¦΄λ¦¬μŠ€λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

μ•„ 멋지닀. 적어도 Insiders λΉŒλ“œμ—μ„œλŠ” 곧 적용되기λ₯Ό λ°”λžλ‹ˆλ‹€. λ‚΄ λ°œκ²¬μ„ λ‹€μ‹œ 보고할 κ²ƒμž…λ‹ˆλ‹€. 감사 ν•΄μš”!

iOS용 Outlook λ‹€μš΄λ‘œλ“œ https://aka.ms/o0ukef


보낸 μ‚¬λžŒ: 필립 ν˜Έν”„ μ•Œλ¦Ό @github.com
보낸 λ‚ μ§œ: 2018λ…„ 10μ›” 19일 κΈˆμš”μΌ μ˜€ν›„ 6:07:29
λ°›λŠ” μ‚¬λžŒ: Microsoft/vscode-docker
μ°Έμ‘°: Gutemberg Ribeiro; μ–ΈκΈ‰ν•˜λ‹€
제λͺ©: Re: [Microsoft/vscode-docker] 디버그 μ»¨ν…Œμ΄λ„ˆ(#56)

@galvesribeiro https://github.com/galvesribeiro μ£„μ†‘ν•©λ‹ˆλ‹€. μ œκ°€ 쑰금 μ•žμ„œκ°„ 것 κ°™μŠ΅λ‹ˆλ‹€. PR이 λ§ˆμŠ€ν„°μ— λ³‘ν•©λ˜μ—ˆμ§€λ§Œ 아직 λ¦΄λ¦¬μŠ€λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

β€”
당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 νšŒμ‹ ν•˜κ±°λ‚˜ GitHub https://github.com/Microsoft/vscode-docker/issues/56#issuecomment-431499291 μ—μ„œ ν™•μΈν•˜κ±°λ‚˜ μŠ€λ ˆλ“œ https://github.com/notifications/unsubscribe-auth/λ₯Ό μŒμ†Œκ±°ν•©λ‹ˆλ‹€.

@galvesribeiro , PR #500에 따라 이 버그λ₯Ό μ’…λ£Œν•©λ‹ˆλ‹€. λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ μƒˆ 버그λ₯Ό μ‹ κ³ ν•˜μ„Έμš”. :-)

멋진 @PrashanthCorp μ•½μ†ν•œ λŒ€λ‘œ ν…ŒμŠ€νŠΈν•  μ‹œκ°„μ΄ μ—†μ—ˆμŠ΅λ‹ˆλ‹€. VSCode의 릴리슀 λΉŒλ“œλ‘œ κ°€λŠ” 길을 μ°Ύμ•˜μŠ΅λ‹ˆκΉŒ? 그것을 μ μ ˆν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•œ λ¬Έμ„œ/κ°€μ΄λ“œκ°€ 있으며 무엇을 κΈ°λŒ€ν•΄μ•Ό ν•©λ‹ˆκΉŒ?

감사 ν•΄μš”!

@galvesribeiro https://github.com/Microsoft/vscode-docker#debugging -net-core-previewλ₯Ό μ‚΄νŽ΄λ³΄μ„Έμš”. κ°μ‚¬ν•©λ‹ˆλ‹€!

cc @ν•„ν˜Έν”„

@StephenWeatherford 감사

방금 λ³΄μ•˜μ§€λ§Œ ... κ·ΈλŸ¬λ‚˜ μ—¬μ „νžˆ 단일 μ»¨ν…Œμ΄λ„ˆ λ””λ²„κ·Έμ—μ„œ 어렀움을 κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€. ( μž‘μ„± λ˜λŠ” kubernetes 지원 μ—†μŒ ...

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰