Instalowanie narzędzi kompilacji w kontenerze
Narzędzia Visual Studio Build Tools można zainstalować w kontenerze systemu Windows, aby obsługiwać przepływy pracy ciągłej integracji i ciągłego dostarczania (CI/CD). W tym artykule opisano wymagane zmiany konfiguracji platformy Docker oraz obciążenia i składniki, które można zainstalować w kontenerze.
Kontenery to doskonały sposób na spakowanie spójnego systemu kompilacji, którego można używać nie tylko w środowisku serwera ciągłej integracji/ciągłego wdrażania, ale także w środowiskach deweloperskich. Możesz na przykład zainstalować kod źródłowy w kontenerze, który ma zostać skompilowany przez dostosowane środowisko, podczas gdy będziesz nadal używać programu Visual Studio lub innych narzędzi do pisania kodu. Jeśli przepływ pracy ciągłej integracji/ciągłego wdrażania używa tego samego obrazu kontenera, możesz mieć pewność, że kod będzie kompilować spójnie. Kontenery można również używać na potrzeby spójności środowiska uruchomieniowego, co jest wspólne dla mikrousług przy użyciu wielu kontenerów z systemem aranżacji; jednak wykracza poza zakres tego artykułu.
Jeśli narzędzia Visual Studio Build Tools nie mają elementów potrzebnych do skompilowania kodu źródłowego, te same kroki mogą być używane w przypadku innych produktów Visual Studio. Należy jednak pamiętać, że kontenery systemu Windows nie obsługują interaktywnego interfejsu użytkownika, więc wszystkie polecenia muszą być zautomatyzowane.
Zanim rozpoczniesz
Poniżej przyjęto założenie znajomości platformy Docker . Jeśli nie znasz jeszcze platformy Docker w systemie Windows, przeczytaj o sposobie instalowania i konfigurowania aparatu platformy Docker w systemie Windows.
Poniższy obraz podstawowy jest przykładem i może nie działać dla systemu. Przeczytaj artykuł Zgodność wersji kontenera systemu Windows, aby określić, którego obrazu podstawowego należy użyć dla danego środowiska.
Tworzenie i kompilowanie pliku Dockerfile
Zapisz następujący przykładowy plik Dockerfile na nowym pliku na dysku. Jeśli plik ma nazwę "Dockerfile", jest rozpoznawany domyślnie.
Ostrzeżenie
W tym przykładzie plik Dockerfile wyklucza tylko wcześniejsze zestawy SDK systemu Windows, których nie można zainstalować w kontenerach. Wcześniejsze wersje powodują niepowodzenie polecenia kompilacji.
Otwórz wiersz polecenia.
Utwórz nowy katalog (zalecane):
mkdir C:\BuildTools
Zmień katalogi na ten nowy katalog:
cd C:\BuildTools
Zapisz następującą zawartość w folderze 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"]
Napiwek
Aby ustawić wartość docelową
-arch=amd64
64-bitową, określ opcję wENTRYPOINT
poleceniu , aby uruchomić wiersz polecenia dewelopera dla programu Visual Studio (VSDevCmd.bat
).Na przykład:
ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
.Ostrzeżenie
Jeśli obraz jest oparty bezpośrednio na pliku microsoft/windowsservercore, program .NET Framework może nie zostać poprawnie zainstalowany i nie zostanie wskazany żaden błąd instalacji. Kod zarządzany może nie zostać uruchomiony po zakończeniu instalacji. Zamiast tego na podstawie obrazu microsoft/dotnet-framework:4.8] lub nowszego. Należy również pamiętać, że obrazy oznakowane w wersji 4.8 lub nowszej mogą używać programu PowerShell jako domyślnego
SHELL
elementu , co spowodujeRUN
niepowodzenie instrukcji iENTRYPOINT
.Zobacz Zgodność wersji kontenera systemu Windows, aby sprawdzić, które wersje systemu operacyjnego kontenera są obsługiwane w których wersjach systemu operacyjnego hosta, oraz Rozwiązywanie problemów z kontenerami windows i narzędzi kompilacji pod kątem znanych problemów.
# 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"]
Napiwek
Aby ustawić wartość docelową
-arch=amd64
64-bitową, określ opcję wENTRYPOINT
poleceniu , aby uruchomić wiersz polecenia dewelopera dla programu Visual Studio (VSDevCmd.bat
).Na przykład:
ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
.Ostrzeżenie
Jeśli obraz jest oparty bezpośrednio na pliku microsoft/windowsservercore, program .NET Framework może nie zostać poprawnie zainstalowany i nie zostanie wskazany żaden błąd instalacji. Kod zarządzany może nie zostać uruchomiony po zakończeniu instalacji. Zamiast tego na podstawie obrazu microsoft/dotnet-framework:4.8 lub nowszego. Należy również pamiętać, że obrazy oznakowane w wersji 4.8 lub nowszej mogą używać programu PowerShell jako domyślnego
SHELL
elementu , co spowodujeRUN
niepowodzenie instrukcji iENTRYPOINT
.Zobacz Zgodność wersji kontenera systemu Windows, aby sprawdzić, które wersje systemu operacyjnego kontenera są obsługiwane w których wersjach systemu operacyjnego hosta, oraz Rozwiązywanie problemów z kontenerami windows i narzędzi kompilacji pod kątem znanych problemów.
Uwaga
Kod
3010
błędu służy do wskazywania powodzenia z wymaganym ponownym uruchomieniem, zobacz MsiExec.exe komunikaty o błędach, aby uzyskać więcej informacji.Uruchom następujące polecenie w tym katalogu.
docker build -t buildtools2019:latest -m 2GB .
To polecenie kompiluje plik Dockerfile w bieżącym katalogu przy użyciu 2 GB pamięci. Domyślna wartość 1 GB nie jest wystarczająca w przypadku zainstalowania niektórych obciążeń; Jednak w zależności od wymagań dotyczących kompilacji można utworzyć tylko 1 GB pamięci.
Końcowy obraz jest oznakowany
buildtools2019:latest
, aby można było łatwo uruchomić go w kontenerze, ponieważbuildtools2019
tag "latest" jest domyślny, jeśli nie określono tagu. Jeśli chcesz użyć konkretnej wersji narzędzi Visual Studio Build Tools 2019 w bardziej zaawansowanym scenariuszu, możesz zamiast tego oznaczyć kontener określonym numerem kompilacji programu Visual Studio, a także "najnowszą", aby kontenery mogły spójnie używać określonej wersji.docker build -t buildtools:latest -m 2GB .
To polecenie kompiluje plik Dockerfile w bieżącym katalogu przy użyciu 2 GB pamięci. Wartość domyślna 1 GB nie jest wystarczająca w przypadku zainstalowania niektórych obciążeń; Jednak w zależności od wymagań dotyczących kompilacji można utworzyć tylko 1 GB pamięci.
Końcowy obraz jest oznaczony tagiem "buildtools:latest", dzięki czemu można łatwo uruchomić go w kontenerze jako "buildtools", ponieważ tag "latest" jest domyślny, jeśli nie określono tagu. Jeśli chcesz użyć określonej wersji narzędzi Visual Studio Build Tools w bardziej zaawansowanym scenariuszu, możesz zamiast tego oznaczyć kontener określonym numerem kompilacji programu Visual Studio, a także "najnowszą", aby kontenery mogły spójnie używać określonej wersji.
Korzystanie z wbudowanego obrazu
Po utworzeniu obrazu możesz uruchomić go w kontenerze, aby wykonać zarówno kompilacje interaktywne, jak i automatyczne. W przykładzie użyto wiersza polecenia dla deweloperów, więc ścieżka i inne zmienne środowiskowe są już skonfigurowane.
Otwórz wiersz polecenia.
Uruchom kontener, aby uruchomić środowisko programu PowerShell ze wszystkimi zestawami zmiennych środowiskowych dla deweloperów:
docker run -it buildtools2019
docker run -it buildtools
Aby użyć tego obrazu dla przepływu pracy ciągłej integracji/ciągłego wdrażania, możesz opublikować go we własnym rejestrze usługi Azure Container Registry lub innym wewnętrznym rejestrze platformy Docker, aby serwery musiały go ściągnąć tylko.
Uwaga
Jeśli uruchomienie kontenera platformy Docker nie powiedzie się, prawdopodobnie wystąpi problem z instalacją programu Visual Studio. Możesz zaktualizować plik Dockerfile, aby usunąć krok wywołujący polecenie wsadowe programu Visual Studio. Dzięki temu można uruchomić kontener platformy Docker i odczytać dzienniki błędów instalacji.
W pliku Dockerfile usuń C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat
parametry i &&
z ENTRYPOINT
polecenia . Polecenie powinno teraz mieć wartość ENTRYPOINT ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
. Następnie ponownie skompiluj plik Dockerfile i wykonaj run
polecenie w celu uzyskania dostępu do plików kontenera. Aby zlokalizować dzienniki błędów instalacji, przejdź do $env:TEMP
katalogu i znajdź dd_setup_<timestamp>_errors.log
plik.
Po zidentyfikowaniu i rozwiązaniu problemu z instalacją można dodać C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat
parametry i &&
z powrotem do ENTRYPOINT
polecenia i ponownie skompilować plik Dockerfile.
Aby uzyskać więcej informacji, zobacz Rozwiązywanie problemów z kontenerami systemu Windows i narzędzi kompilacji.
Rozwiązywanie problemów z kontenerami windows i narzędzi kompilacji
Podczas instalowania programu Visual Studio w kontenerze platformy Docker występuje kilka problemów.
Rozwiązywanie problemów z kontenerami systemu Windows
Podczas instalowania narzędzi Visual Studio Build Tools w kontenerze systemu Windows występują następujące znane problemy.
Przekaż
-m 2GB
(lub więcej) podczas kompilowania obrazu. Niektóre obciążenia wymagają więcej pamięci niż domyślne 1 GB podczas instalacji.Skonfiguruj platformę Docker do używania dysków większych niż domyślne 20 GB.
Przekaż
--norestart
wiersz polecenia. Od tego zapisu próba ponownego uruchomienia kontenera systemu Windows z poziomu kontenera powróciERROR_TOO_MANY_OPEN_FILES
do hosta.Jeśli obraz jest oparty bezpośrednio na mcr.microsoft.com/windows/servercore, program .NET Framework może nie zostać poprawnie zainstalowany i nie zostanie wskazany żaden błąd instalacji. Kod zarządzany może nie zostać uruchomiony po zakończeniu instalacji. Zamiast tego na podstawie obrazu microsoft/dotnet-framework:4.7.1 lub nowszego. Na przykład podczas kompilowania przy użyciu programu MSBuild może wystąpić błąd podobny do następującego:
C:\BuildTools\MSBuild\15.0\bin\Roslyn\Microsoft.CSharp.Core.targets(84,5): błąd MSB6003: Nie można uruchomić określonego pliku wykonywalnego zadania "csc.exe". Nie można załadować pliku lub zestawu "System.IO.FileSystem, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f1d50a3a" lub jednej z jego zależności. W systemie nie można odnaleźć określonego pliku.
Rozwiązywanie problemów z kontenerami narzędzi kompilacji
Podczas korzystania z kontenera Narzędzi kompilacji mogą wystąpić następujące znane problemy. Aby sprawdzić, czy problemy zostały rozwiązane, czy istnieją inne znane problemy, odwiedź społeczność deweloperów.
- Funkcja IntelliTrace może nie działać w niektórych scenariuszach w kontenerze.
- W starszych wersjach platformy Docker dla systemu Windows domyślny rozmiar obrazu kontenera wynosi tylko 20 GB i nie będzie pasował do narzędzi Build Tools. Postępuj zgodnie z instrukcjami, aby zmienić rozmiar obrazu na 127 GB lub więcej.
Aby potwierdzić problem z miejscem na dysku, sprawdź pliki dziennika, aby uzyskać więcej informacji. Plik
vslogs\dd_setup_<timestamp>_errors.log
będzie zawierać następujące elementy, jeśli zabraknie miejsca na dysku:
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.