Instalowanie narzędzi kompilacji w kontenerze

Możesz zainstalować Visual Studio Build Tools w kontenerze Windows, aby obsługiwać przepływy pracy ciągłej integracji i ciągłego dostarczania (CI/CD). Ten artykuł zawiera instrukcje dotyczące wymaganych zmian konfiguracji platformy Docker oraz obciążeń i składników, które można zainstalować w kontenerze.

Kontenery to doskonały sposób na spakowania spójnego systemu kompilacji, z których można korzystać nie tylko w środowisku serwera CI/CD, ale także w środowiskach deweloperskich. Na przykład możesz zainstalować kod źródłowy w kontenerze, który ma zostać sbudowaną przez dostosowane środowisko, podczas gdy będziesz nadal używać Visual Studio lub innych narzędzi do pisania kodu. Jeśli przepływ pracy ci/cd używa tego samego obrazu kontenera, możesz mieć pewność, że kod jest kompilowany spójnie. Kontenerów można również używać w celu zapewnienia spójności środowiska uruchomieniowego, co jest typowe w przypadku mikrousług korzystających z wielu kontenerów z systemem aranżacji; jednak wykracza poza zakres tego artykułu.

Jeśli Visual Studio Build Tools nie ma tego, czego potrzebujesz do skompilowania kodu źródłowego, te same kroki mogą być używane w przypadku Visual Studio produktów. Należy jednak pamiętać, że kontenery Windows nie obsługują interaktywnego interfejsu użytkownika, dlatego wszystkie polecenia muszą być zautomatyzowane.

Zanim rozpoczniesz

Poniżej przyjęto założenie, że znajomość platformy Docker jest nieco znana. Jeśli jeszcze nie wiesz, jak uruchamiać aplikację Docker na Windows, przeczytaj o instalowania i konfigurowaniu aparatu platformy Dockerna Windows .

Poniższy obraz podstawowy jest przykładowy i może nie działać dla Twojego systemu. Przeczytaj Windows zgodności wersji kontenera, aby określić, którego obrazu podstawowego należy użyć dla środowiska.

Tworzenie i kompilowanie pliku Dockerfile

Zapisz następujący przykładowy plik Dockerfile w nowym pliku na dysku. Jeśli plik ma nazwę po prostu "Dockerfile", jest rozpoznawany domyślnie.

Ostrzeżenie

W tym przykładzie plik Dockerfile wyklucza tylko wcześniejsze Windows SDK, 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 image with .NET Framework 4.7.2.
    FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-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/15/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 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) `
        `
        # 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:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
    

    Porada

    Aby uzyskać listę obciążeń i składników, zobacz katalog Visual Studio Build Tools składnika.

    Ostrzeżenie

    Jeśli obraz bazuje bezpośrednio na bazie microsoft/windowsservercore lub mcr.microsoft.com/windows/servercore (zobacz katalog kontenerów syndykatów firmy Microsoft),.NET Framework może nie zostać poprawnie zainstalowany i nie jest wyświetlany błąd instalacji. Kod zarządzany może nie zostać uruchomiony po zakończeniu instalacji. Zamiast tego należy bazować obraz na microsoft/dotnet-framework:4.7.2 lub nowszej. Należy również pamiętać, że obrazy oznaczone tagiem w wersji 4.7.2 lub nowszej mogą używać programu PowerShell jako domyślnego polecenia , co spowoduje niepowodzenie instrukcji SHELL RUN i ENTRYPOINT .

    Visual Studio 2017 w wersji 15.8 lub starszej (dowolny produkt) nie zostanie poprawnie zainstalowany na mcr.microsoft.com/windows/servercore:1809 lub nowszym. Błąd nie jest wyświetlany.

    Zobacz Windows wersji kontenera, aby zobaczyć, które wersje systemu operacyjnego kontenera są obsługiwane w których wersjach systemu operacyjnego hosta, i Znane problemy dotyczące kontenerów w przypadku znanych problemów.

    # 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"]
    
    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 modify `
            --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"]
    

    Porada

    Aby uzyskać listę obciążeń i składników, zobacz katalog Visual Studio Build Tools składnika.

    Ostrzeżenie

    Jeśli obraz bazuje bezpośrednio na bazie microsoft/windowsservercore, .NET Framework może nie zostać poprawnie zainstalowany i nie zostanie wskazany błąd instalacji. Kod zarządzany może nie zostać uruchomiony po zakończeniu instalacji. Zamiast tego należy bazować obraz na microsoft/dotnet-framework:4.8 lub nowszej. Należy również zauważyć, że obrazy oznaczone tagiem w wersji 4.8 lub nowszej mogą używać programu PowerShell jako domyślnego polecenia , co spowoduje niepowodzenie SHELL RUN instrukcji i ENTRYPOINT .

    Zobacz Windows wersji kontenera, aby zobaczyć, które wersje systemu operacyjnego kontenera są obsługiwane w których wersjach systemu operacyjnego hosta, i Znane problemy dotyczące kontenerów w przypadku znanych problemów.

    # 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"]
    
    RUN `
        # Download the Build Tools bootstrapper.
        curl -SL --output vs_buildtools.exe https://aka.ms/vs/17/pre/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 modify `
            --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"]
    

    Porada

    Aby uzyskać listę obciążeń i składników, zobacz katalog Visual Studio Build Tools składnika.

    Ostrzeżenie

    Jeśli obraz bazuje bezpośrednio na bazie microsoft/windowsservercore, .NET Framework może nie zostać poprawnie zainstalowany i nie zostanie wskazany błąd instalacji. Kod zarządzany może nie zostać uruchomiony po zakończeniu instalacji. Zamiast tego należy bazować obraz na microsoft/dotnet-framework:4.8 lub nowszej. Należy również zauważyć, że obrazy oznaczone tagiem w wersji 4.8 lub nowszej mogą używać programu PowerShell jako domyślnego polecenia , co spowoduje niepowodzenie SHELL RUN instrukcji i ENTRYPOINT .

    Zobacz Windows wersji kontenera, aby zobaczyć, które wersje systemu operacyjnego kontenera są obsługiwane w których wersjach systemu operacyjnego hosta, i Znane problemy dotyczące kontenerów w przypadku znanych problemów.

    Uwaga

    Kod błędu służy do wskazywania powodzenia z wymaganym ponownym uruchomieniem. Aby uzyskać więcej 3010 informacji, zobaczMsiExec.exe komunikatów o błędach.

  5. Uruchom następujące polecenie w tym katalogu.

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

    To polecenie tworzy plik Dockerfile w bieżącym katalogu przy użyciu 2 GB pamięci. Domyślna 1 GB nie jest wystarczająca, jeśli są zainstalowane niektóre obciążenia. Jednak w zależności od wymagań kompilacji można utworzyć tylko 1 GB pamięci.

    Końcowy obraz jest oznaczony tagiem "buildtools2017:latest", dzięki czemu można łatwo uruchomić go w kontenerze jako "buildtools2017", ponieważ tag "latest" jest domyślny, jeśli nie określono tagu. Jeśli chcesz użyć określonej wersji programu Visual Studio Build Tools 2017 w bardziej zaawansowanym scenariuszu, możesz zamiast tego otagować kontener określonym numerem kompilacji Visual Studio oraz "najnowszą", aby kontenery mogły spójnie używać określonej wersji.

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

    To polecenie tworzy plik Dockerfile w bieżącym katalogu przy użyciu 2 GB pamięci. Domyślna 1 GB nie jest wystarczająca, jeśli są zainstalowane niektóre obciążenia. Jednak w zależności od wymagań kompilacji można utworzyć tylko 1 GB pamięci.

    Końcowy obraz jest oznaczony tagiem "buildtools2019:latest", dzięki czemu można łatwo uruchomić go w kontenerze jako "buildtools2019", ponieważ tag "latest" jest domyślny, jeśli nie określono tagu. Jeśli chcesz użyć określonej wersji programu Visual Studio Build Tools 2019 w bardziej zaawansowanym scenariuszu, możesz zamiast tego otagować kontener określonym numerem kompilacji Visual Studio oraz "najnowszą", aby kontenery mogły spójnie używać określonej wersji.

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

    To polecenie tworzy plik Dockerfile w bieżącym katalogu przy użyciu 2 GB pamięci. Domyślna 1 GB nie jest wystarczająca, jeśli są zainstalowane niektóre obciążenia. Jednak w zależności od wymagań 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 programu Visual Studio Build Tools w bardziej zaawansowanym scenariuszu, możesz zamiast tego otagować kontener określonym numerem kompilacji Visual Studio, a także "najnowszą", aby kontenery mogły spójnie używać określonej wersji.

Korzystanie z obrazu wbudowanego

Teraz, po utworzeniu obrazu, możesz uruchomić go w kontenerze w celu tworzenia interaktywnych i zautomatyzowanych kompilacji. W przykładzie użyto wiersz polecenia dla deweloperów, więc twoja ścieżka i inne zmienne środowiskowe są już skonfigurowane.

  1. Otwórz wiersz polecenia.

  2. Uruchom kontener, aby uruchomić środowisko programu PowerShell z ustawionymi wszystkimi zmiennymi środowiskowym dewelopera:

    docker run -it buildtools2017
    
    docker run -it buildtools2019
    
    docker run -it buildtools
    

Aby użyć tego obrazu dla przepływu pracy ci/CD, możesz opublikować go we własnym Azure Container Registry lub w innym wewnętrznym rejestrze platformy Docker, aby serwery potrzebowały tylko go ściągnąć.

Uwaga

Jeśli nie można uruchomić kontenera platformy Docker, prawdopodobnie występuje Visual Studio instalacji. Możesz zaktualizować plik Dockerfile, aby usunąć krok, który wywołuje polecenie Visual Studio batch. Dzięki temu można uruchomić kontener platformy Docker i odczytać dzienniki błędów instalacji.

W pliku Dockerfile usuń parametry C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat i && z polecenia ENTRYPOINT . Polecenie powinno teraz mieć 1.0. ENTRYPOINT ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"] Następnie ponownie skompilować plik Dockerfile i wykonać 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ź plik dd_setup_<timestamp>_errors.log .

Po zidentyfikowaniu i naprawieniu problemu z instalacją możesz dodać parametry i z powrotem do polecenia i C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat ponownie skompilować && plik ENTRYPOINT Dockerfile.

Aby uzyskać więcej informacji, zobacz Znane problemy dotyczące kontenerów.

Uzyskiwanie pomocy technicznej

Czasami coś może pójść nie tak. Jeśli instalacja Visual Studio nie powiedzie się, zobacz Rozwiązywanie Visual Studio problemów z instalacją i uaktualnieniem, aby uzyskać szczegółowe wskazówki.

Oferujemy również opcję pomocy technicznej czatu instalacyjnego (tylko w języku angielskim) w przypadku problemów związanych z instalacją.

Oto kilka innych opcji pomocy technicznej:

  • Zgłoś nam problemy z produktem za pomocą narzędzia Zgłoś problem, które jest wyświetlane zarówno w Instalator programu Visual Studio, jak i w Visual Studio IDE.
  • Sugeruj funkcję, śledź problemy z produktami i znajdź odpowiedzi w Visual Studio Developer Community.
  • Użyj swojego GitHub, aby porozmawiać z nami i innymi deweloperami Visual Studio w Visual Studio konwersacji w społeczności Gitter.

Zobacz też