Visual Studio Build Tools를 Windows 컨테이너에 설치하여 CI/CD(지속적인 통합/지속적인 업데이트) 워크플로를 지원할 수 있습니다. 이 문서에서는 컨테이너에 설치할 수 있는 워크로드 및 구성 요소뿐만 아니라 변경할 필요가 있는 Docker 구성을 안내합니다.
컨테이너는 CI/CD 서버 환경뿐만 아니라 개발 환경에서도 사용할 수 있는 일관된 빌드 시스템을 패키지하는 유용한 방법입니다. 예를 들어 Visual Studio 또는 다른 도구를 사용하여 코드를 계속 작성하는 동안 사용자 지정 환경에서 빌드할 컨테이너에 소스 코드를 탑재할 수 있습니다. CI/CD 워크플로에서 동일한 컨테이너 이미지를 사용하면 코드를 일관되게 작성할 수 있습니다. 또한 런타임 일관성을 위해서도 컨테이너를 사용할 수 있습니다. 이 경우 오케스트레이션 시스템에서 여러 컨테이너를 사용하는 마이크로 서비스에는 일반적이지만 이 문서의 범위를 벗어납니다.
Visual Studio Build Tools에 소스 코드를 빌드하는 데 필요한 것이 없는 경우 다른 Visual Studio 제품에 대해 동일한 단계를 사용할 수 있습니다. 그러나 Windows 컨테이너는 대화형 사용자 인터페이스를 지원하지 않으므로 모든 명령을 자동화해야 합니다.
microsoft/windowsservercore에 이미지를 직접 베이스하는 경우 .NET Framework는 제대로 설치되지 않을 수 있으며 설치 오류가 표시되지 않습니다. 관리 코드는 설치가 완료된 후 실행되지 않을 수 있습니다. 대신, microsoft/dotnet-framework:4.8 혹은 이상에서 이미지를 베이스합니다. 또한 버전 4.8 이상 태그가 지정된 이미지는 RUN 및 ENTRYPOINT 지침 실패로 이어지는 기본값 SHELL로 PowerShell을 사용할 수 있습니다.
microsoft/windowsservercore에 이미지를 직접 베이스하는 경우 .NET Framework는 제대로 설치되지 않을 수 있으며 설치 오류가 표시되지 않습니다. 관리 코드는 설치가 완료된 후 실행되지 않을 수 있습니다. 대신, microsoft/dotnet-framework:4.8 이상에서 이미지를 베이스합니다. 또한 버전 4.8 이상 태그가 지정된 이미지는 RUN 및 ENTRYPOINT 지침 실패로 이어지는 기본값 SHELL로 PowerShell을 사용할 수 있습니다.
오류 코드 3010은 재부팅이 성공해야 함을 나타내는 데 사용됩니다. 자세한 내용은 MsiExec.exe 오류 메시지를 참조하세요.
해당 디렉터리 내에서 다음 명령을 실행합니다.
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 및 기타 환경 변수가 이미 구성되어 있습니다.
명령 프롬프트가 엽니다.
컨테이너를 실행하여 모든 개발자 환경 변수가 설정된 PowerShell 환경을 시작합니다.
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 컨테이너에 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를 방문하세요.
이전 버전의 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.
Visual Studio Code Dev Containers 확장을 사용하여 완전한 기능을 갖춘 컨테이너 기반 개발 환경을 만들고 구성합니다. 컨테이너에서 폴더 또는 리포지토리를 열고 IntelliSense(완성), 코드 탐색, 디버깅과 같은 Visual Studio Code의 전체 기능 세트를 활용합니다.