Build Tools를 컨테이너에 설치Install Build Tools into a container

Visual Studio Build Tools를 Windows 컨테이너에 설치하여 CI/CD(지속적인 통합/지속적인 업데이트) 워크플로를 지원할 수 있습니다.You can install Visual Studio Build Tools into a Windows container to support continuous integration and continuous delivery (CI/CD) workflows. 이 문서에서는 컨테이너에 설치할 수 있는 워크로드 및 구성 요소뿐만 아니라 변경할 필요가 있는 Docker 구성을 안내합니다.This article guides you through what Docker configuration changes are required as well as what workloads and components you can install in a container.

컨테이너는 CI/CD 서버 환경뿐만 아니라 개발 환경에서도 사용할 수 있는 일관된 빌드 시스템을 패키지하는 유용한 방법입니다.Containers are a great way to package a consistent build system you can use not only in a CI/CD server environment but for development environments as well. 예를 들어 Visual Studio 또는 다른 도구를 사용하여 코드를 계속 작성하는 동안 사용자 지정 환경에서 빌드할 컨테이너에 소스 코드를 탑재할 수 있습니다.For example, you can mount your source code into a container to be built by a customized environment while you continue to use Visual Studio or other tools to write your code. CI/CD 워크플로에서 동일한 컨테이너 이미지를 사용하면 코드를 일관되게 작성할 수 있습니다.If your CI/CD workflow uses the same container image, you can rest assured that your code builds consistently. 또한 런타임 일관성을 위해서도 컨테이너를 사용할 수 있습니다. 이 경우 오케스트레이션 시스템에서 여러 컨테이너를 사용하는 마이크로 서비스에는 일반적이지만 이 문서의 범위를 벗어납니다.You can use containers for runtime consistency as well, which is common for micro-services using multiple containers with an orchestration system; however, is beyond the scope of this article.

Visual Studio Build Tools에 소스 코드를 빌드하는 데 필요한 것이 없는 경우 다른 Visual Studio 제품에 대해 동일한 단계를 사용할 수 있습니다.If Visual Studio Build Tools does not have what you require to build your source code, these same steps can be used for other Visual Studio products. 그러나 Windows 컨테이너는 대화형 사용자 인터페이스를 지원하지 않으므로 모든 명령을 자동화해야 합니다.Do note, however, that Windows containers do not support an interactive user interface so all commands must be automated.

시작하기 전에Before you begin

아래에서는 Docker에 어느 정도 익숙한 것으로 간주합니다.Some familiarity with Docker is assumed below. Windows에서 Docker 실행에 대해 아직 익숙하지 않은 경우 Windows에서 Docker 엔진 설치 및 구성 방법을 확인하세요.If you're not already familiar with running Docker on Windows, read about how to install and configure the Docker engine on Windows.

아래 기본 이미지는 샘플이며 사용자 시스템에서는 작동하지 않을 수 있습니다.The base image below is a sample and may not work for your system. 사용자 환경에서 어떤 기본 이미지를 사용해야 하는지 확인하려면 Windows 컨테이너 버전 호환성을 참조하세요.Read Windows container version compatibility to determine which base image you should use for your environment.

Dockerfile 만들기 및 빌드Create and build the Dockerfile

다음 예제 Dockerfile을 디스크의 새 파일에 저장합니다.Save the following example Dockerfile to a new file on your disk. 파일 이름이 단순히 "Dockerfile"이면 기본적으로 인식됩니다.If the file is named simply "Dockerfile", it is recognized by default.

경고

이 Dockerfile 예제는 컨테이너에 설치할 수 없는 이전 버전의 Windows SDK만 제외합니다.This example Dockerfile excludes only earlier Windows SDKs that cannot be installed into containers. 이전 릴리스에서는 빌드 명령이 실패하게 됩니다.Earlier releases cause the build command to fail.

  1. 명령 프롬프트를 엽니다.Open a command prompt.

  2. 새 디렉터리를 만듭니다(권장).Create a new directory (recommended):

    mkdir C:\BuildTools
    
  3. 디렉터리를 이 새 디렉터리로 변경합니다.Change directories to this new directory:

    cd C:\BuildTools
    
  4. 다음 내용을 C:\BuildTools\Dockerfile에 저장합니다.Save the following content to C:\BuildTools\Dockerfile.

    # escape=`
    
    # Use the latest Windows Server Core image with .NET Framework 4.7.2.
    FROM mcr.microsoft.com/dotnet/framework/sdk:4.7.2-windowsservercore-ltsc2019
    
    # Restore the default Windows shell for correct batch processing.
    SHELL ["cmd", "/S", "/C"]
    
    # Download the Build Tools bootstrapper.
    ADD https://aka.ms/vs/15/release/vs_buildtools.exe C:\TEMP\vs_buildtools.exe
    
    # Install Build Tools with the Microsoft.VisualStudio.Workload.AzureBuildTools workload, excluding workloads and components with known issues.
    RUN start /wait C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
        --installPath C:\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
    
    # Define the entry point for the Docker container.
    # This entry point starts the developer command prompt and launches the PowerShell shell.
    ENTRYPOINT ["C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
    

    워크로드 및 구성 요소 목록은 Visual Studio Build Tools 구성 요소 디렉터리를 참조하세요.For a list of workloads and components, see the Visual Studio Build Tools component directory.

    경고

    이미지가 직접 microsoft/windowsservercore 또는 mcr.microsoft.com/windows/servercore를 기반으로 하는 경우(Microsoft 신디케이트 컨테이너 카탈로그 참조) .NET Framework가 올바로 설치되지 않을 수 있으며 설치 오류 표시가 되지 않습니다.If you base your image directly on microsoft/windowsservercore or mcr.microsoft.com/windows/servercore (see Microsoft syndicates container catalog), the .NET Framework might not install properly and no install error is indicated. 관리 코드는 설치가 완료된 후 실행되지 않을 수 있습니다.Managed code might not run after the install is complete. 대신, microsoft/dotnet-framework:4.7.2 이상에서 이미지를 기반으로 합니다.Instead, base your image on microsoft/dotnet-framework:4.7.2 or later. 또한 버전 4.7.2 이상 태그가 지정된 이미지는 RUNENTRYPOINT 지침 실패로 이어지는 기본값 SHELL로 PowerShell을 사용할 수 있습니다.Also note that images that are tagged version 4.7.2 or later might use PowerShell as the default SHELL, which will cause the RUN and ENTRYPOINT instructions to fail.

    Visual Studio 2017 버전 15.8 또는 이전 버전(제품)이 mcr.microsoft.com/windows/servercore:1809 이상에 제대로 설치되지 않습니다.Visual Studio 2017 version 15.8 or earlier (any product) will not properly install on mcr.microsoft.com/windows/servercore:1809 or later. 오류가 표시되지 않습니다.No error is displayed.

    어떤 호스트 OS 버전에 어떤 컨테이너 OS 버전이 지원되는지 확인하려면 Windows 컨테이너 버전 호환성을 참조하고, 알려진 문제의 경우에는 알려진 컨테이너 관련 문제를 참조하세요.See Windows container version compatibility to see which container OS versions are supported on which host OS versions, and Known issues for containers for known issues.

    # escape=`
    
    # Use the latest Windows Server Core image with .NET Framework 4.8.
    FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019
    
    # Restore the default Windows shell for correct batch processing.
    SHELL ["cmd", "/S", "/C"]
    
    # Download the Build Tools bootstrapper.
    ADD https://aka.ms/vs/16/release/vs_buildtools.exe C:\TEMP\vs_buildtools.exe
    
    # Install Build Tools with the Microsoft.VisualStudio.Workload.AzureBuildTools workload, excluding workloads and components with known issues.
    RUN C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
        --installPath C:\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
    
    # Define the entry point for the docker container.
    # This entry point starts the developer command prompt and launches the PowerShell shell.
    ENTRYPOINT ["C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
    

    워크로드 및 구성 요소 목록은 Visual Studio Build Tools 구성 요소 디렉터리를 참조하세요.For a list of workloads and components, see the Visual Studio Build Tools component directory.

    경고

    microsoft/windowsservercore에 이미지를 직접 베이스하는 경우 .NET Framework는 제대로 설치되지 않을 수 있으며 설치 오류가 표시되지 않습니다.If you base your image directly on microsoft/windowsservercore, the .NET Framework might not install properly and no install error is indicated. 관리 코드는 설치가 완료된 후 실행되지 않을 수 있습니다.Managed code might not run after the install is complete. 대신, microsoft/dotnet-framework:4.8 이상에서 이미지를 베이스합니다.Instead, base your image on microsoft/dotnet-framework:4.8 or later. 또한 버전 4.8 이상 태그가 지정된 이미지는 RUNENTRYPOINT 지침 실패로 이어지는 기본값 SHELL로 PowerShell을 사용할 수 있습니다.Also note that images that are tagged version 4.8 or later might use PowerShell as the default SHELL, which will cause the RUN and ENTRYPOINT instructions to fail.

    어떤 호스트 OS 버전에 어떤 컨테이너 OS 버전이 지원되는지 확인하려면 Windows 컨테이너 버전 호환성을 참조하고, 알려진 문제의 경우에는 알려진 컨테이너 관련 문제를 참조하세요.See Windows container version compatibility to see which container OS versions are supported on which host OS versions, and Known issues for containers for known issues.

    참고

    오류 코드 3010은 재부팅이 성공해야 함을 나타내는 데 사용됩니다. 자세한 내용은 MsiExec.exe 오류 메시지를 참조하세요.Error code 3010 is used to indicate success with a reboot required, see MsiExec.exe error messages for more information.

  5. 해당 디렉터리 내에서 다음 명령을 실행합니다.Run the following command within that directory.

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

    이 명령은 현재 디렉터리에서 2GB의 메모리를 사용하여 Dockerfile을 빌드합니다.This command builds the Dockerfile in the current directory using 2 GB of memory. 일부 작업을 설치하는 경우 기본 1GB가 충분하지 않지만 빌드 요구 사항에 따라 1GB의 메모리만으로도 빌드할 수 있습니다.The default 1 GB is not sufficient when some workloads are installed; however, you might be able to build with only 1 GB of memory depending on your build requirements.

    최종 이미지에는 "buildtools2017:latest"라는 태그가 지정됩니다. 태그가 지정되지 않더라도 "latest" 태그가 기본값이므로 컨테이너에서 해당 이미지를 "buildtools2017"로 쉽게 실행할 수 있습니다.The final image is tagged "buildtools2017:latest" so you can easily run it in a container as "buildtools2017" since the "latest" tag is the default if no tag is specified. 더 많은 고급 시나리오에서 특정 버전의 Visual Studio Build Tools 2017을 사용하려는 경우, 컨테이너에서 특정 버전을 일관되게 사용할 수 있도록 특정 Visual Studio 빌드 번호뿐만 아니라 "latest"도 포함된 태그를 컨테이너에 지정할 수도 있습니다.If you want to use a specific version of Visual Studio Build Tools 2017 in a more advanced scenario, you might instead tag the container with a specific Visual Studio build number as well as "latest" so containers can use a specific version consistently.

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

    이 명령은 현재 디렉터리에서 2GB의 메모리를 사용하여 Dockerfile을 빌드합니다.This command builds the Dockerfile in the current directory using 2 GB of memory. 일부 작업을 설치하는 경우 기본 1GB가 충분하지 않지만 빌드 요구 사항에 따라 1GB의 메모리만으로도 빌드할 수 있습니다.The default 1 GB is not sufficient when some workloads are installed; however, you might be able to build with only 1 GB of memory depending on your build requirements.

    최종 이미지에는 "buildtools2019:latest"라는 태그가 지정됩니다. 태그가 지정되지 않더라도 "latest" 태그가 기본값이므로 컨테이너에서 해당 이미지를 "buildtools2019"로 쉽게 실행할 수 있습니다.The final image is tagged "buildtools2019:latest" so you can easily run it in a container as "buildtools2019" since the "latest" tag is the default if no tag is specified. 더 많은 고급 시나리오에서 특정 버전의 Visual Studio Build Tools 2019를 사용하려는 경우, 컨테이너에서 특정 버전을 일관되게 사용할 수 있도록 특정 Visual Studio 빌드 번호뿐만 아니라 "latest"도 포함된 태그를 컨테이너에 지정할 수도 있습니다.If you want to use a specific version of Visual Studio Build Tools 2019 in a more advanced scenario, you might instead tag the container with a specific Visual Studio build number as well as "latest" so containers can use a specific version consistently.

빌드된 이미지 사용Using the built image

이제 이미지를 만들었으므로 컨테이너 내에서 해당 이미지를 실행하여 대화형 빌드와 자동화된 빌드를 모두 수행할 수 있습니다.Now that you have created an image, you can run it in a container to do both interactive and automated builds. 이 예제에서는 개발자 명령 프롬프트를 사용하므로 PATH 및 기타 환경 변수가 이미 구성되어 있습니다.The example uses the Developer Command Prompt, so your PATH and other environment variables are already configured.

  1. 명령 프롬프트를 엽니다.Open a command prompt.

  2. 컨테이너를 실행하여 모든 개발자 환경 변수가 설정된 PowerShell 환경을 시작합니다.Run the container to start a PowerShell environment with all developer environment variables set:

    docker run -it buildtools2017
    
    docker run -it buildtools2019
    

이 이미지를 CI/CD 워크플로에 사용하려면 자신의 Azure Container Registry 또는 다른 내부 Docker 레지스트리에 게시하여 서버에서 끌어오기만 하면 됩니다.To use this image for your CI/CD workflow, you can publish it to your own Azure Container Registry or other internal Docker registry so servers need only to pull it.

참고

Docker 컨테이너가 시작되지 않는다면 Visual Studio 설치 문제가 있는 것일 수 있습니다.If the Docker container fails to start, there's likely a Visual Studio installation issue. Visual Studio 일괄 처리 명령을 호출하는 단계가 제거되도록 Dockerfile을 업데이트해 보세요.You can update the Dockerfile to remove the step that calls the Visual Studio batch command. 이렇게 하면 Docker 컨테이너를 시작하고 설치 오류 로그를 읽을 수 있습니다.This enables you to start the Docker container and read the installation error logs.

Dockerfile 파일에서 ENTRYPOINT 명령의 C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat 매개 변수와 && 매개 변수를 제거합니다.In your Dockerfile file, remove the C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat and && parameters from the ENTRYPOINT command. 그러면 명령이 ENTRYPOINT ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]가 됩니다.The command should now be ENTRYPOINT ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]. 다음으로 Dockerfile을 다시 빌드하고 run 명령을 실행하여 컨테이너 파일에 액세스합니다.Next, rebuild the Dockerfile and execute the run command to access container files. 설치 오류 로그를 찾으려면 $env:TEMP 디렉터리로 이동하여 dd_setup_<timestamp>_errors.log 파일을 찾습니다.To locate the installation error logs, go to the $env:TEMP directory and locate the dd_setup_<timestamp>_errors.log file.

설치 문제를 찾아서 해결한 후에는 ENTRYPOINT 명령에 C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat 매개 변수와 && 매개 변수를 추가하고 Dockerfile을 다시 빌드하면 됩니다.After you identify and fix the installation issue, you can add the C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat and && parameters back to the ENTRYPOINT command and rebuild your Dockerfile.

자세한 내용은 컨테이너의 알려진 문제를 참조하세요.For more information, see Known issues for containers.

지원 받기Get support

때로는 무엇인가 잘못될 수도 있습니다.Sometimes, things can go wrong. Visual Studio 설치에 실패하는 경우 단계별 지침은 Visual Studio 설치 및 업그레이드 문제 해결을 참조하세요.If your Visual Studio installation fails, see Troubleshoot Visual Studio installation and upgrade issues for step-by-step guidance.

설치 관련 문제를 위한 설치 채팅(영어만 가능) 지원 옵션도 제공됩니다.We also offer an installation chat (English only) support option for installation-related issues.

몇 가지 추가 지원 옵션은 다음과 같습니다.Here are a few more support options:

참고 항목See also