Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Puede instalar Visual Studio Build Tools en un contenedor de Windows para admitir flujos de trabajo de integración continua y entrega continua (CI/CD). Este artículo le guía a través de los cambios de configuración de Docker necesarios, así como las cargas de trabajo y los componentes que puede instalar en un contenedor.
Los contenedores son una excelente manera de empaquetar un sistema de compilación coherente que puede usar, no solo en un entorno de servidor de CI/CD, sino también para entornos de desarrollo. Por ejemplo, puede montar su código fuente en un contenedor para ser construido por un entorno personalizado mientras sigue usando Visual Studio u otras herramientas para escribir su código. Si el flujo de trabajo de CI/CD usa la misma imagen de contenedor, puede estar seguro de que el código se compila de forma coherente. También puede usar contenedores para la coherencia en tiempo de ejecución, que es común para los microservicios que usan varios contenedores con un sistema de orquestación; sin embargo, eso está fuera del ámbito de este artículo.
Si Visual Studio Build Tools no tiene lo que necesita para compilar el código fuente, estos mismos pasos se pueden usar para otros productos de Visual Studio. Sin embargo, tenga en cuenta que los contenedores de Windows no admiten una interfaz de usuario interactiva, por lo que todos los comandos deben automatizarse.
Antes de empezar
Se presupone cierta familiaridad con Docker . Si no está familiarizado con él, aprenda a instalar y configurar el motor de Docker en Windows.
La siguiente imagen base es un ejemplo y es posible que no funcione para el sistema. Lea sobre la compatibilidad de las versiones de los contenedores de Windows para determinar qué imagen base debe usar para su entorno.
Crear y compilar el Dockerfile
Guarde el siguiente dockerfile de ejemplo en un archivo nuevo en el disco. Si el archivo se denomina simplemente Dockerfile, se reconoce de forma predeterminada.
Advertencia
Este dockerfile de ejemplo excluye solo los SDK de Windows anteriores que no se pueden instalar en contenedores. Las versiones anteriores hacen que se produzca un error en el comando de compilación.
Abra una consola de comandos.
Cree un directorio (recomendado):
mkdir C:\BuildToolsCambie los directorios a este nuevo directorio:
cd C:\BuildToolsGuarde el siguiente contenido en C:\BuildTools\Dockerfile.
# 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"]Sugerencia
Para tener como destino 64 bits, especifique la
-arch=amd64opción en elENTRYPOINTcomando para iniciar el símbolo del sistema para desarrolladores para Visual Studio (VSDevCmd.bat).Por ejemplo:
ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]Advertencia
Si su imagen se basa directamente en microsoft/windowsservercore, es posible que .NET Framework no se instale correctamente y no se indique un error de instalación. Es posible que el código administrado no se ejecute una vez completada la instalación. En su lugar, base la imagen en microsoft/dotnet-framework:4.8 o posterior. Tenga en cuenta también que las imágenes etiquetadas con la versión 4.8 o posterior podrían usar PowerShell como valor predeterminado
SHELL, lo que hace que se produzca un error en lasRUNinstrucciones yENTRYPOINT.Para obtener información sobre qué versiones del sistema operativo de contenedor se admiten en qué versiones del sistema operativo host, consulte Compatibilidad de versiones del contenedor de Windows. Consulte Solución de problemas de contenedores de Windows y Herramientas de compilación para ver si hay problemas conocidos.
Nota:
El código de error
3010se usa para indicar éxito, con un reinicio necesario. Para obtener más información, consulte MsiExec.exe mensajes de error.Ejecute el siguiente comando dentro de ese directorio.
docker build -t buildtools:latest -m 2GB .Este comando compila el Dockerfile en el directorio actual con 2 GB de memoria. El valor predeterminado de 1 GB no es suficiente cuando se instalan algunas cargas de trabajo; Sin embargo, puede compilar con solo 1 GB de memoria en función de los requisitos de compilación.
La imagen final se etiqueta buildtools:latest para que pueda ejecutarla fácilmente en un contenedor como buildtools , ya que la etiqueta más reciente es la predeterminada si no se especifica ninguna etiqueta. Si quiere usar una versión específica de Visual Studio Build Tools en un escenario más avanzado, podría etiquetar el contenedor con un número de compilación específico de Visual Studio, así como más reciente para que los contenedores puedan usar una versión específica de forma coherente.
Utilice la imagen compilada
Ahora que ha creado una imagen, puede ejecutarla en un contenedor para realizar compilaciones interactivas y automatizadas. En el ejemplo se usa el símbolo del sistema para desarrolladores, por lo que la ruta de acceso y otras variables de entorno ya están configuradas.
Abra una consola de comandos.
Ejecute el contenedor para iniciar un entorno de PowerShell con todas las variables de entorno de desarrollador establecidas:
docker run -it buildtools
Para usar esta imagen para el flujo de trabajo de CI/CD, puede publicarla en su propio registro de Azure Container Registry u otro registro interno de Docker para que los servidores solo necesiten extraerla.
Nota:
Si el contenedor de Docker no se inicia, es probable que haya un problema de instalación de Visual Studio. Puede actualizar el Dockerfile para quitar el paso que llama al comando por lotes de Visual Studio. Esto le permite iniciar el contenedor de Docker y leer los registros de errores de instalación.
En el archivo Dockerfile, quite los parámetros C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat y && del comando ENTRYPOINT. El comando ahora debe ser ENTRYPOINT ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]. A continuación, vuelva a generar el Dockerfile y ejecute el run comando para acceder a los archivos de contenedor. Para buscar los registros de errores de instalación, vaya al $env:TEMP directorio y busque el dd_setup_<timestamp>_errors.log archivo.
Después de identificar y corregir el problema de instalación, puede agregar de nuevo los parámetros C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat y && al comando y regenerar su Dockerfile ENTRYPOINT.
Para obtener más información, consulte Solución de problemas de contenedores de Windows y Build Tools.
Solución de problemas de contenedores de Windows y Build Tools
Hay algunos problemas al instalar Visual Studio en un contenedor de Docker.
Solución de problemas de contenedores de Windows
Los siguientes problemas conocidos se producen al instalar Visual Studio Build Tools en un contenedor de Windows.
Proporcione
-m 2GB(o más) al compilar la imagen. Algunas cargas de trabajo requieren más memoria que los 1 GB predeterminados cuando se instalan.Configure Docker para que use discos mayores que los 20 GB predeterminados.
Pase
--norestarten la línea de comandos. A partir de esta escritura, al intentar reiniciar un contenedor de Windows desde dentro del contenedor, se devuelveERROR_TOO_MANY_OPEN_FILESal host.Si basa su imagen directamente en mcr.microsoft.com/windows/servercore, es posible que el .NET Framework no se instale correctamente y no se muestre ningún error de instalación. Es posible que el código administrado no se ejecute una vez completada la instalación. En su lugar, base su imagen en microsoft/dotnet-framework:4.7.1 o posterior. Por ejemplo, es posible que vea un error al compilar con MSBuild similar al siguiente:
C:\BuildTools\MSBuild\15.0\bin\Roslyn\Microsoft.CSharp.Core.targets(84,5): error MSB6003: el ejecutable de tarea especificado "csc.exe" no se pudo ejecutar. No se pudo cargar el archivo o ensamblado 'System.IO.FileSystem, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' o una de sus dependencias. El sistema no puede encontrar el archivo especificado.
Solucionar problemas de contenedores de herramientas de compilación
Es posible que se produzcan los siguientes problemas conocidos al usar un contenedor de Herramientas de compilación. Para ver si se han corregido problemas o si hay otros problemas conocidos, visite Developer Community.
- Es posible que IntelliTrace no funcione en algunos escenarios dentro de un contenedor.
- En versiones anteriores de Docker para Windows, el tamaño predeterminado de la imagen de contenedor es de solo 20 GB y no se ajusta a las herramientas de compilación. Siga las instrucciones para cambiar el tamaño de la imagen a 127 GB o más.
Para confirmar un problema de espacio en disco, compruebe los archivos de registro para obtener más información. El
vslogs\dd_setup_<timestamp>_errors.logarchivo incluye lo siguiente si se agota el espacio en disco:
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.