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.

  1. Otwórz wiersz polecenia.

  2. Utwórz nowy katalog (zalecane):

    mkdir C:\BuildTools
    
  3. Zmień katalogi na ten nowy katalog:

    cd C:\BuildTools
    
  4. 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ę w ENTRYPOINT 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 SHELLelementu , co spowoduje RUN niepowodzenie instrukcji i ENTRYPOINT .

    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ę w ENTRYPOINT 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 SHELLelementu , co spowoduje RUN niepowodzenie instrukcji i ENTRYPOINT .

    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.

  5. 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.

  1. Otwórz wiersz polecenia.

  2. 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óci ERROR_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.