Menginstal Build Tools ke dalam kontainer

Anda dapat menginstal Alat Build Visual Studio ke dalam kontainer Windows untuk mendukung integrasi berkelanjutan dan alur kerja pengiriman berkelanjutan (CI/CD). Artikel ini memandu Anda melalui perubahan konfigurasi Docker apa yang diperlukan serta beban kerja dan komponen apa yang dapat Anda instal dalam kontainer.

Kontainer adalah cara yang bagus untuk mengemas sistem build yang konsisten yang dapat Anda gunakan tidak hanya di lingkungan server CI/CD tetapi juga untuk lingkungan pengembangan. Misalnya, Anda dapat memasang kode sumber ke dalam kontainer untuk dibangun oleh lingkungan yang disesuaikan saat Anda terus menggunakan Visual Studio atau alat lain untuk menulis kode Anda. Jika alur kerja CI/CD Anda menggunakan gambar kontainer yang sama, Anda dapat yakin bahwa kode Anda dibangun secara konsisten. Anda juga dapat menggunakan kontainer untuk konsistensi runtime, yang umum untuk layanan mikro menggunakan beberapa kontainer dengan sistem orkestrasi; namun, berada di luar cakupan artikel ini.

Jika Alat Build Visual Studio tidak memiliki apa yang Anda butuhkan untuk membangun kode sumber Anda, langkah-langkah yang sama ini dapat digunakan untuk produk Visual Studio lainnya. Namun, perhatikan bahwa kontainer Windows tidak mendukung antarmuka pengguna interaktif sehingga semua perintah harus otomatis.

Sebelum Anda mulai

Beberapa keakraban dengan Docker diasumsikan di bawah ini. Jika Anda belum terbiasa menjalankan Docker di Windows, baca tentang cara menginstal dan mengonfigurasi mesin Docker di Windows.

Gambar dasar di bawah ini adalah sampel dan mungkin tidak berfungsi untuk sistem Anda. Baca kompatibilitas versi kontainer Windows untuk menentukan gambar dasar mana yang harus Anda gunakan untuk lingkungan Anda.

Membuat dan membangun Dockerfile

Simpan contoh Dockerfile berikut ke file baru di disk Anda. Jika file diberi nama hanya "Dockerfile", file tersebut dikenali secara default.

Peringatan

Contoh Dockerfile ini hanya mengecualikan SDK Windows sebelumnya yang tidak dapat diinstal ke dalam kontainer. Rilis sebelumnya menyebabkan perintah build gagal.

  1. Buka prompt perintah.

  2. Buat direktori baru (disarankan):

    mkdir C:\BuildTools
    
  3. Ubah direktori ke direktori baru ini:

    cd C:\BuildTools
    
  4. Simpan konten berikut ke 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"]
    

    Tip

    Untuk menargetkan 64-bit, tentukan -arch=amd64 opsi dalam ENTRYPOINT perintah untuk memulai Perintah Pengembang untuk Visual Studio (VSDevCmd.bat).

    Misalnya: ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

    Peringatan

    Jika Anda mendasarkan gambar Anda langsung di microsoft/windowsservercore, .NET Framework mungkin tidak diinstal dengan benar dan tidak ada kesalahan penginstalan yang ditunjukkan. Kode terkelola mungkin tidak berjalan setelah penginstalan selesai. Sebagai gantinya, dasarkan gambar Anda pada microsoft/dotnet-framework:4.8] atau yang lebih baru. Perhatikan juga bahwa gambar yang diberi tag versi 4.8 atau yang lebih baru mungkin menggunakan PowerShell sebagai default SHELL, yang akan menyebabkan RUN instruksi dan ENTRYPOINT gagal.

    Lihat Kompatibilitas versi kontainer Windows untuk melihat versi OS kontainer mana yang didukung pada versi OS host mana, dan Pemecahan Masalah kontainer Windows dan Build Tools untuk masalah yang diketahui.

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

    Tip

    Untuk menargetkan 64-bit, tentukan -arch=amd64 opsi dalam ENTRYPOINT perintah untuk memulai Perintah Pengembang untuk Visual Studio (VSDevCmd.bat).

    Misalnya: ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

    Peringatan

    Jika Anda mendasarkan gambar Anda langsung di microsoft/windowsservercore, .NET Framework mungkin tidak diinstal dengan benar dan tidak ada kesalahan penginstalan yang ditunjukkan. Kode terkelola mungkin tidak berjalan setelah penginstalan selesai. Sebagai gantinya, dasarkan gambar Anda pada microsoft/dotnet-framework:4.8 atau yang lebih baru. Perhatikan juga bahwa gambar yang diberi tag versi 4.8 atau yang lebih baru mungkin menggunakan PowerShell sebagai default SHELL, yang akan menyebabkan RUN instruksi dan ENTRYPOINT gagal.

    Lihat Kompatibilitas versi kontainer Windows untuk melihat versi OS kontainer mana yang didukung pada versi OS host mana, dan Pemecahan Masalah kontainer Windows dan Build Tools untuk masalah yang diketahui.

    Catatan

    Kode 3010 kesalahan digunakan untuk menunjukkan keberhasilan dengan reboot yang diperlukan, lihat pesan kesalahan MsiExec.exe untuk informasi selengkapnya.

  5. Jalankan perintah berikut dalam direktori tersebut.

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

    Perintah ini membangun Dockerfile di direktori saat ini menggunakan memori 2 GB. Default 1 GB tidak cukup ketika beberapa beban kerja diinstal; namun, Anda mungkin dapat membangun hanya dengan memori 1 GB tergantung pada persyaratan build Anda.

    Gambar akhir ditandai buildtools2019:latest sehingga Anda dapat dengan mudah menjalankannya dalam kontainer karena buildtools2019 tag "terbaru" adalah default jika tidak ada tag yang ditentukan. Jika Anda ingin menggunakan versi Visual Studio Build Tools 2019 tertentu dalam skenario yang lebih canggih, Anda mungkin menandai kontainer dengan nomor build Visual Studio tertentu serta "terbaru" sehingga kontainer dapat menggunakan versi tertentu secara konsisten.

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

    Perintah ini membangun Dockerfile di direktori saat ini menggunakan memori 2 GB. Default 1 GB tidak cukup ketika beberapa beban kerja diinstal; namun, Anda mungkin dapat membangun hanya dengan memori 1 GB tergantung pada persyaratan build Anda.

    Gambar akhir ditandai "buildtools:latest" sehingga Anda dapat dengan mudah menjalankannya dalam kontainer sebagai "buildtools" karena tag "terbaru" adalah default jika tidak ada tag yang ditentukan. Jika Anda ingin menggunakan versi Visual Studio Build Tools tertentu dalam skenario yang lebih canggih, Anda mungkin menandai kontainer dengan nomor build Visual Studio tertentu serta "terbaru" sehingga kontainer dapat menggunakan versi tertentu secara konsisten.

Menggunakan gambar bawaan

Setelah membuat gambar, Anda dapat menjalankannya dalam kontainer untuk melakukan build interaktif dan otomatis. Contoh menggunakan Prompt Perintah Pengembang, sehingga PATH Anda dan variabel lingkungan lainnya sudah dikonfigurasi.

  1. Buka prompt perintah.

  2. Jalankan kontainer untuk memulai lingkungan PowerShell dengan semua variabel lingkungan pengembang yang ditetapkan:

    docker run -it buildtools2019
    
    docker run -it buildtools
    

Untuk menggunakan gambar ini untuk alur kerja CI/CD, Anda dapat menerbitkannya ke Azure Container Registry Anda sendiri atau registri Docker internal lainnya sehingga server hanya perlu menariknya.

Catatan

Jika kontainer Docker gagal dimulai, kemungkinan ada masalah penginstalan Visual Studio. Anda dapat memperbarui Dockerfile untuk menghapus langkah yang memanggil perintah batch Visual Studio. Ini memungkinkan Anda untuk memulai kontainer Docker dan membaca log kesalahan penginstalan.

Di file Dockerfile Anda, hapus C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat parameter dan && dari ENTRYPOINT perintah . Perintah sekarang harus ENTRYPOINT ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]. Selanjutnya, bangun kembali Dockerfile dan jalankan run perintah untuk mengakses file kontainer. Untuk menemukan log kesalahan penginstalan, buka $env:TEMP direktori dan temukan dd_setup_<timestamp>_errors.log file.

Setelah mengidentifikasi dan memperbaiki masalah penginstalan, Anda dapat menambahkan C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat parameter dan && kembali ke ENTRYPOINT perintah dan membangun kembali Dockerfile Anda.

Untuk informasi selengkapnya, lihat Pemecahan Masalah kontainer Windows dan Build Tools.

Pemecahan masalah kontainer Windows dan Build Tools

Ada beberapa masalah saat menginstal Visual Studio ke dalam kontainer Docker.

Memecahkan masalah kontainer Windows

Masalah umum berikut terjadi saat Anda menginstal Alat Build Visual Studio ke dalam kontainer Windows.

  • Teruskan -m 2GB (atau lebih) saat membangun gambar. Beberapa beban kerja memerlukan lebih banyak memori daripada default 1 GB saat diinstal.

  • Konfigurasikan Docker untuk menggunakan disk yang lebih besar dari default 20 GB.

  • Teruskan --norestart pada baris perintah. Pada penulisan ini, mencoba menghidupkan ulang kontainer Windows dari dalam kontainer kembali ERROR_TOO_MANY_OPEN_FILES ke host.

  • Jika Anda mendasarkan gambar Anda langsung pada mcr.microsoft.com/windows/servercore, .NET Framework mungkin tidak diinstal dengan benar dan tidak ada kesalahan penginstalan yang ditunjukkan. Kode terkelola mungkin tidak berjalan setelah penginstalan selesai. Sebagai gantinya, dasarkan gambar Anda pada microsoft/dotnet-framework:4.7.1 atau yang lebih baru. Sebagai contoh, Anda mungkin melihat kesalahan saat membangun dengan MSBuild yang mirip dengan yang berikut ini:

    C:\BuildTools\MSBuild\15.0\bin\Roslyn\Microsoft.CSharp.Core.targets(84,5): kesalahan MSB6003: Tugas yang ditentukan dapat dijalankan "csc.exe" tidak dapat dijalankan. Tidak dapat memuat file atau rakitan 'System.IO.FileSystem, Version=4.0.1.0, Culture=netral, PublicKeyToken=b03f5f7f11d50a3a' atau salah satu dependensinya. Sistem tidak dapat menemukan file yang ditentukan

Memecahkan masalah kontainer Build Tools

Masalah umum berikut mungkin terjadi saat Anda menggunakan kontainer Build Tools. Untuk melihat apakah masalah telah diperbaiki atau jika ada masalah lain yang diketahui, kunjungi Komunitas Pengembang.

  • IntelliTrace mungkin tidak berfungsi dalam beberapa skenario dalam kontainer.
  • Pada versi Docker untuk Windows yang lebih lama, ukuran gambar kontainer default hanya 20 GB dan tidak akan sesuai dengan Build Tools. Ikuti petunjuk untuk mengubah ukuran gambar menjadi 127 GB atau lebih. Untuk mengonfirmasi masalah ruang disk, periksa file log untuk informasi selengkapnya. File Anda vslogs\dd_setup_<timestamp>_errors.log akan menyertakan yang berikut ini jika Anda kehabisan ruang disk:
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.