Build Tools를 컨테이너에 설치

Visual Studio Build Tools를 Windows 컨테이너에 설치하여 CI/CD(지속적인 통합/지속적인 업데이트) 워크플로를 지원할 수 있습니다. 이 문서에서는 컨테이너에 설치할 수 있는 워크로드 및 구성 요소뿐만 아니라 변경할 필요가 있는 Docker 구성을 안내합니다.

컨테이너는 CI/CD 서버 환경뿐만 아니라 개발 환경에서도 사용할 수 있는 일관된 빌드 시스템을 패키지하는 유용한 방법입니다. 예를 들어 Visual Studio 또는 다른 도구를 사용하여 코드를 계속 작성하는 동안 사용자 지정 환경에서 빌드할 컨테이너에 소스 코드를 탑재할 수 있습니다. CI/CD 워크플로에서 동일한 컨테이너 이미지를 사용하면 코드를 일관되게 작성할 수 있습니다. 또한 런타임 일관성을 위해서도 컨테이너를 사용할 수 있습니다. 이 경우 오케스트레이션 시스템에서 여러 컨테이너를 사용하는 마이크로 서비스에는 일반적이지만 이 문서의 범위를 벗어납니다.

Visual Studio Build Tools에 소스 코드를 빌드하는 데 필요한 것이 없는 경우 다른 Visual Studio 제품에 대해 동일한 단계를 사용할 수 있습니다. 그러나 Windows 컨테이너는 대화형 사용자 인터페이스를 지원하지 않으므로 모든 명령을 자동화해야 합니다.

시작하기 전에

아래에서는 Docker에 어느 정도 익숙한 것으로 간주합니다. Windows에서 Docker 실행에 대해 아직 익숙하지 않은 경우 Windows에서 Docker 엔진 설치 및 구성 방법을 확인하세요.

아래 기본 이미지는 샘플이며 사용자 시스템에서는 작동하지 않을 수 있습니다. 사용자 환경에서 어떤 기본 이미지를 사용해야 하는지 확인하려면 Windows 컨테이너 버전 호환성을 참조하세요.

Dockerfile 만들기 및 빌드

다음 예제 Dockerfile을 디스크의 새 파일에 저장합니다. 파일 이름이 단순히 "Dockerfile"이면 기본적으로 인식됩니다.

Warning

이 Dockerfile 예제는 컨테이너에 설치할 수 없는 이전 버전의 Windows SDK만 제외합니다. 이전 릴리스에서는 빌드 명령이 실패하게 됩니다.

  1. 명령 프롬프트가 엽니다.

  2. 새 디렉터리를 만듭니다(권장).

    mkdir C:\BuildTools
    
  3. 디렉터리를 이 새 디렉터리로 변경합니다.

    cd C:\BuildTools
    
  4. 다음 내용을 C:\BuildTools\Dockerfile에 저장합니다.

    # escape=`
    
    # Use the latest Windows Server Core 2019 image.
    FROM mcr.microsoft.com/windows/servercore:ltsc2019
    
    # Restore the default Windows shell for correct batch processing.
    SHELL ["cmd", "/S", "/C"]
    
    RUN `
        # Download the Build Tools bootstrapper.
        curl -SL --output vs_buildtools.exe https://aka.ms/vs/16/release/vs_buildtools.exe `
        `
        # Install Build Tools with the Microsoft.VisualStudio.Workload.AzureBuildTools workload, excluding workloads and components with known issues.
        && (start /w vs_buildtools.exe --quiet --wait --norestart --nocache `
            --installPath "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\BuildTools" `
            --add Microsoft.VisualStudio.Workload.AzureBuildTools `
            --remove Microsoft.VisualStudio.Component.Windows10SDK.10240 `
            --remove Microsoft.VisualStudio.Component.Windows10SDK.10586 `
            --remove Microsoft.VisualStudio.Component.Windows10SDK.14393 `
            --remove Microsoft.VisualStudio.Component.Windows81SDK `
            || IF "%ERRORLEVEL%"=="3010" EXIT 0) `
        `
        # Cleanup
        && del /q vs_buildtools.exe
    
    # Define the entry point for the docker container.
    # This entry point starts the developer command prompt and launches the PowerShell shell.
    ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
    

    64비트 대상을 지정하려면 명령에서 Visual Studio용 개발자 ENTRYPOINT 명령 프롬프트()를 (VSDevCmd.bat) 시작하는 -arch=amd64 옵션을 지정합니다.

    예: ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

    Warning

    microsoft/windowsservercore에 이미지를 직접 베이스하는 경우 .NET Framework는 제대로 설치되지 않을 수 있으며 설치 오류가 표시되지 않습니다. 관리 코드는 설치가 완료된 후 실행되지 않을 수 있습니다. 대신, microsoft/dotnet-framework:4.8 혹은 이상에서 이미지를 베이스합니다. 또한 버전 4.8 이상 태그가 지정된 이미지는 RUNENTRYPOINT 지침 실패로 이어지는 기본값 SHELL로 PowerShell을 사용할 수 있습니다.

    어떤 호스트 OS 버전에 어떤 컨테이너 OS 버전이 지원되는지 확인하려면 Windows 컨테이너 버전 호환성을 참조하고, 알려진 문제의 경우에는 Windows and Build Tools 문제해결를 참조하세요.

    # escape=`
    
    # Use the latest Windows Server Core 2022 image.
    FROM mcr.microsoft.com/windows/servercore:ltsc2022
    
    # Restore the default Windows shell for correct batch processing.
    SHELL ["cmd", "/S", "/C"]
    
    RUN `
        # Download the Build Tools bootstrapper.
        curl -SL --output vs_buildtools.exe https://aka.ms/vs/17/release/vs_buildtools.exe `
        `
        # Install Build Tools with the Microsoft.VisualStudio.Workload.AzureBuildTools workload, excluding workloads and components with known issues.
        && (start /w vs_buildtools.exe --quiet --wait --norestart --nocache `
            --installPath "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools" `
            --add Microsoft.VisualStudio.Workload.AzureBuildTools `
            --remove Microsoft.VisualStudio.Component.Windows10SDK.10240 `
            --remove Microsoft.VisualStudio.Component.Windows10SDK.10586 `
            --remove Microsoft.VisualStudio.Component.Windows10SDK.14393 `
            --remove Microsoft.VisualStudio.Component.Windows81SDK `
            || IF "%ERRORLEVEL%"=="3010" EXIT 0) `
        `
        # Cleanup
        && del /q vs_buildtools.exe
    
    # Define the entry point for the docker container.
    # This entry point starts the developer command prompt and launches the PowerShell shell.
    ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
    

    64비트 대상을 지정하려면 명령에서 Visual Studio용 개발자 ENTRYPOINT 명령 프롬프트()를 (VSDevCmd.bat) 시작하는 -arch=amd64 옵션을 지정합니다.

    예: ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

    Warning

    microsoft/windowsservercore에 이미지를 직접 베이스하는 경우 .NET Framework는 제대로 설치되지 않을 수 있으며 설치 오류가 표시되지 않습니다. 관리 코드는 설치가 완료된 후 실행되지 않을 수 있습니다. 대신, microsoft/dotnet-framework:4.8 이상에서 이미지를 베이스합니다. 또한 버전 4.8 이상 태그가 지정된 이미지는 RUNENTRYPOINT 지침 실패로 이어지는 기본값 SHELL로 PowerShell을 사용할 수 있습니다.

    어떤 호스트 OS 버전에 어떤 컨테이너 OS 버전이 지원되는지 확인하려면 Windows 컨테이너 버전 호환성을 참조하고, 알려진 문제의 경우에는 Windows and Build Tools 문제해결를 참조하세요.

    참고 항목

    오류 코드 3010은 재부팅이 성공해야 함을 나타내는 데 사용됩니다. 자세한 내용은 MsiExec.exe 오류 메시지를 참조하세요.

  5. 해당 디렉터리 내에서 다음 명령을 실행합니다.

    docker build -t buildtools2019:latest -m 2GB .
    

    이 명령은 현재 디렉터리에서 2GB의 메모리를 사용하여 Dockerfile을 빌드합니다. 일부 작업을 설치하는 경우 기본 1GB가 충분하지 않지만 빌드 요구 사항에 따라 1GB의 메모리만으로도 빌드할 수 있습니다.

    최종 이미지에는 buildtools2019:latest 라는 태그가 지정됩니다. 태그가 지정되지 않더라도 “latest” 태그가 기본값이므로 컨테이너에서 해당 이미지를 buildtools2019 로 쉽게 실행할 수 있습니다. 더 많은 고급 시나리오에서 특정 버전의 Visual Studio Build Tools 2019를 사용하려는 경우, 컨테이너에서 특정 버전을 일관되게 사용할 수 있도록 특정 Visual Studio 빌드 번호뿐만 아니라 "latest"도 포함된 태그를 컨테이너에 지정할 수도 있습니다.

    docker build -t buildtools:latest -m 2GB .
    

    이 명령은 현재 디렉터리에서 2GB의 메모리를 사용하여 Dockerfile을 빌드합니다. 일부 작업을 설치하는 경우 기본 1GB가 충분하지 않지만 빌드 요구 사항에 따라 1GB의 메모리만으로도 빌드할 수 있습니다.

    최종 이미지에는 “buildtools:latest”라는 태그가 지정됩니다. 태그가 지정되지 않더라도 “latest” 태그가 기본값이므로 컨테이너에서 해당 이미지를 “buildtools”로 쉽게 실행할 수 있습니다. 더 많은 고급 시나리오에서 특정 버전의 Visual Studio Build Tools를 사용하려는 경우, 컨테이너에서 특정 버전을 일관되게 사용할 수 있도록 특정 Visual Studio 빌드 번호뿐만 아니라 “latest”도 포함된 태그를 컨테이너에 지정할 수도 있습니다.

빌드된 이미지 사용

이제 이미지를 만들었으므로 컨테이너 내에서 해당 이미지를 실행하여 대화형 빌드와 자동화된 빌드를 모두 수행할 수 있습니다. 이 예제에서는 개발자 명령 프롬프트를 사용하므로 PATH 및 기타 환경 변수가 이미 구성되어 있습니다.

  1. 명령 프롬프트가 엽니다.

  2. 컨테이너를 실행하여 모든 개발자 환경 변수가 설정된 PowerShell 환경을 시작합니다.

    docker run -it buildtools2019
    
    docker run -it buildtools
    

이 이미지를 CI/CD 워크플로에 사용하려면 자신의 Azure Container Registry 또는 다른 내부 Docker 레지스트리에 게시하여 서버에서 끌어오기만 하면 됩니다.

참고 항목

Docker 컨테이너가 시작되지 않는다면 Visual Studio 설치 문제가 있는 것일 수 있습니다. Visual Studio 일괄 처리 명령을 호출하는 단계가 제거되도록 Dockerfile을 업데이트해 보세요. 이렇게 하면 Docker 컨테이너를 시작하고 설치 오류 로그를 읽을 수 있습니다.

Dockerfile 파일에서 ENTRYPOINT 명령의 C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat 매개 변수와 && 매개 변수를 제거합니다. 그러면 명령이 ENTRYPOINT ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]가 됩니다. 다음으로 Dockerfile을 다시 빌드하고 run 명령을 실행하여 컨테이너 파일에 액세스합니다. 설치 오류 로그를 찾으려면 $env:TEMP 디렉터리로 이동하여 dd_setup_<timestamp>_errors.log 파일을 찾습니다.

설치 문제를 찾아서 해결한 후에는 ENTRYPOINT 명령에 C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat 매개 변수와 && 매개 변수를 추가하고 Dockerfile을 다시 빌드하면 됩니다.

자세한 내용은 Windows 및 빌드 도구 컨테이너 문제 해결을 참조하세요.

빌드 도구 컨테이너 그리고 Windows 문제 해결

Visual Studio를 Docker 컨테이너에 설치하는 데 몇 가지 문제가 있습니다.

Windows 컨테이너 문제 해결

다음 알려진 문제는 Windows 컨테이너에 Visual Studio Build Tools를 설치할 경우 발생합니다.

  • 이미지 빌드 시 -m 2GB(또는 이상)를 전달합니다. 일부 워크로드는 설치 시 기본 1GB 이상의 메모리가 필요합니다.

  • 기본값 20GB보다 큰 디스크를 사용하도록 Docker를 구성합니다.

  • 명령줄에서 --norestart를 전달합니다. 이 문서 작성 당시, 컨테이너 내부에서 Windows 컨테이너를 다시 시작하려면 ERROR_TOO_MANY_OPEN_FILES가 호스트여야 합니다.

  • 이미지가 직접 mcr.microsoft.com/windows/servercore를 기반으로 하는 경우 .NET Framework가 올바르게 설치되지 않을 수 있으며 설치 오류는 표시되지 않습니다. 관리 코드는 설치가 완료된 후 실행되지 않을 수 있습니다. 대신, microsoft/dotnet-framework:4.7.1 이상에서 이미지를 베이스합니다. 예를 들어 다음과 유사한 MSBuild로 빌드할 때 오류가 표시될 수 있습니다.

    C:\BuildTools\MSBuild\15.0\bin\Roslyn\Microsoft.CSharp.Core.targets(84,5): 오류 MSB6003: 지정된 작업 실행 파일 "csc.exe"를 실행할 수 없습니다. 파일이나 어셈블리 'System.IO.FileSystem, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 시스템은 지정된 파일을 찾을 수 없습니다.

빌드 도구 컨테이너 문제 해결

빌드 도구 컨테이너를 사용하는 경우 다음과 같은 알려진 문제가 발생할 수 있습니다. 문제가 해결되었는지 또는 다른 알려진 문제가 있는지 확인하려면 Developer Community를 방문하세요.

  • IntelliTrace는 컨테이너 내의 일부 시나리오에서 작동하지 않을 수 있습니다.
  • 이전 버전의 Windows용 Docker에서는 기본 컨테이너 이미지가 20GB 뿐이므로 빌드 도구에 맞지 않습니다. 이미지 크기 변경 지침에 따라 127GB 이상으로 확장하세요. 디스크 공간 문제를 확인하려면 로그 파일에서 자세한 내용을 확인하세요. 디스크 공간이 부족한 경우 vslogs\dd_setup_<timestamp>_errors.log 파일에 다음이 포함됩니다.
Pre-check verification: Visual Studio needs at least 91.99 GB of disk space. Try to free up space on C:\ or change your target drive.
Pre-check verification failed with error(s) :  SizePreCheckEvaluator.