Horario Laboral: De lunes a viernes, de 10AM a 10PM

imagen destacada del post con un texto en el centro que dice Cómo compilar código usando contenedores para comenzar fácil y rápido y abajo del texto aparece la categoria del post

Introducción: La compilación moderna en entornos contenerizados

En el desarrollo de software, especialmente con lenguajes compilados como C, C++, C#, Java o similares, el proceso de compilación es un paso fundamental y distintivo. Tradicionalmente, esto ha implicado la instalación local de kits de desarrollo (SDK) y compiladores específicos en cada máquina de desarrollo. Sin embargo, este enfoque presenta desafíos de mantenimiento, compatibilidad y portabilidad que pueden retrasar proyectos y generar el tan temido “funciona en mi máquina”.

El auge de la virtualización ligera mediante contenedores, particularmente con Docker, ofrece una solución práctica y eficiente para estos problemas. En este artículo técnico y detallado, exploraremos cómo utilizar contenedores para compilar código de manera fácil, rápida y reproducible, eliminando la necesidad de mantener SDKs locales. Además, cubriremos las particularidades del uso en Windows y Linux y cómo configurar correctamente el flujo de trabajo.

1. ¿Por qué usar contenedores para compilar?

En lenguajes compilados, el SDK contiene herramientas esenciales como compiladores, bibliotecas y utilidades de desarrollo, mientras que las máquinas de producción solo requieren el entorno de ejecución más liviano. Utilizar contenedores para compilar nos permite:

  • Evitar la instalación local de SDKs pesados y complejos.
  • Garantizar consistencia en compilaciones entre distintos entornos.
  • Aislar el proceso evitando conflictos con otras herramientas instaladas.
  • Facilitar la automatización e integración continua junto con pipelines DevOps.

Esto es especialmente útil en equipos con múltiples desarrolladores o en entornos donde la estabilidad y replicabilidad son clave.

1.1 Lenguajes con separación clara entre compilación y ejecución

Es importante entender en qué casos esta técnica es especialmente relevante. Lenguajes como C, C++, C# y Java requieren un proceso de compilación explícito para transformar el código fuente en un ejecutable o bytecode. Por ello, necesitan un SDK para compilar y un entorno de ejecución para correr el código.

En contraste, lenguajes interpretados o con ejecución dinámica, como Node.js, Go o Python, no requieren esta separación rígida, dado que el mismo entorno se utiliza tanto para desarrollo como para ejecución.

Así, la estrategia de compilación mediante contenedores se orienta a estos lenguajes “tradicionales” que requieren SDKs especializados.

2. Fundamentos de Docker para compilación

Docker es la plataforma líder para crear, distribuir y ejecutar contenedores. Un contenedor es una unidad liviana que agrupa código, dependencias, herramientas y configuraciones necesarias para ejecutar una aplicación o tarea.

En nuestro contexto, usaremos imágenes oficiales del SDK del lenguaje en cuestión, que contienen todos los compiladores y utilidades necesarias. Esto nos permite crear contenedores efímeros que compilen nuestro código sin ensuciar nuestro sistema.

2.1 Imagen del SDK

Las imágenes de SDK contienen:

  • Compiladores específicos (por ejemplo, dotnet build, gcc).
  • Herramientas de construcción y test.
  • Bibliotecas necesarias para desarrollo.

Estas imágenes están disponibles para múltiples plataformas, incluyendo Linux y Windows, y son mantenidas oficialmente, por ejemplo, por Microsoft para .NET.

2.2 Montaje de volúmenes

Para que nuestro contenedor acceda al código fuente almacenado en nuestra máquina local, usamos volúmenes. Esto permite compartir carpetas entre el host y el contenedor. Por ejemplo, el comando -v $(pwd):/code monta el directorio actual en el contenedor dentro de /code.

Guía práctica para usar Multi-Stage-Build y trabajar con contenedoresGuía práctica para usar Multi-Stage-Build y trabajar con contenedores

Esto es clave porque:

  • Permite que el código compilado se genere en el host.
  • Facilita editar el código en tu editor favorito mientras el contenedor hace la compilación.

3. Paso a paso: Compilando un proyecto con Docker

Veamos cómo aplicar esta técnica de forma práctica, tomando como ejemplo un proyecto simple con .NET, pero la misma lógica aplica para otros SDKs.

3.1 Preparar el entorno y descargar la imagen SDK

  1. Instalar Docker Desktop en tu máquina (docker.com/products/docker-desktop).
  2. Descargar la imagen oficial del SDK:
docker pull mcr.microsoft.com/dotnet/sdk

Este comando solo debe ejecutarse una vez para obtener la imagen.

3.2 Ejecutar un contenedor interactivo con el código montado

En el directorio que contiene el código fuente, ejecuta:

docker run -it -v $(pwd):/code mcr.microsoft.com/dotnet/sdk sh

Esto hace lo siguiente:

  • -it: conecta el terminal para interacción.
  • -v $(pwd):/code: monta el directorio local al contenedor.
  • Ejecuta un shell sh dentro del contenedor.

3.3 Compilar dentro del contenedor

Ahora dentro del contenedor, cambia al directorio montado:

cd /code

Ejecuta la compilación con:

dotnet build

Se generarán los binarios en subcarpetas dentro de la carpeta montada, visibles desde el host.

3.4 Salir del contenedor

Una vez compilado, usa exit para cerrar el contenedor interactivo. El contenedor se detendrá.

4. Manejo de diferencias entre Linux y Windows

Al usar Docker en Windows con Docker Desktop, los contenedores por defecto son Linux, pues Docker Desktop opera sobre una máquina virtual ligera basada en Linux llamada WSL2.

Esto genera una situación particular:

  • El contenedor genera executables Linux.
  • Estos ejecutables no funcionan directamente en Windows.

Esto puede generar confusión si se compiló un proyecto .NET en un contenedor Linux y se espera ejecutarlo directamente en Windows.

Cómo ejecutar contenedores en otra máquina y empezar a trabajar con ellosCómo ejecutar contenedores en otra máquina y empezar a trabajar con ellos

4.1 Solución: Contenedores Windows

Docker también soporta contenedores Windows que permiten generar binarios compatibles nativamente con Windows, incluyendo ejecutables .exe.

Para utilizar contenedores Windows, hay que cambiar el modo de Docker Desktop:

  • En el menú contextual de Docker Desktop, seleccionar Switch to Windows Containers.
  • Luego, descargar la imagen Windows del SDK, por ejemplo:
docker pull mcr.microsoft.com/dotnet/sdk:windowsservercore-ltsc2022

4.2 Ejecutar y compilar en modo contenedor Windows

Cambia los comandos para adaptarse a Windows:

  • Mapea rutas Windows (C:/ruta/a/codigo).
  • Ejecutar consola cmd en vez de sh.
docker run -it -v C:\ruta\a\codigo:C:\code mcr.microsoft.com/dotnet/sdk:windowsservercore-ltsc2022 cmd

Después compila con:

cd C:\code dotnet build

Los binarios generados serán ejecutables Windows, listos para correr en tu máquina.

5. Tabla comparativa: Contenedores Linux vs Windows para compilación

Característica Contenedores Linux Contenedores Windows
Plataforma base Linux (WSL2 en Windows) Windows Server Core / Nano Server
Compatibilidad ejecutables Genera binarios Linux Genera binarios Windows (.exe)
Velocidad / tamaño Imágenes más ligeras y rápidas Imágenes generalmente más pesadas
Uso recomendado Compilar para despliegues Linux Compilar para entornos Windows
Configuración en Windows Docker Desktop en modo Linux (por defecto) Se debe activar “Switch to Windows containers”

6. Buenas prácticas para compilar código en contenedores

  • Mantén tus imágenes actualizadas para aprovechar las mejoras y parches de seguridad.
  • Utiliza versiones específicas de imágenes para garantizar que el entorno no cambie inesperadamente.
  • Evita modificar imágenes oficiales: En su lugar, crea imágenes derivadas con un Dockerfile para personalizaciones.
  • Controla los volúmenes para asegurar que el código fuente y los binarios estén sincronizados correctamente.
  • Integra compilación con CI/CD para automatizar y asegurar la calidad del proceso.

7. Consideraciones avanzadas y consejos técnicos

7.1 Automatización de compilación con Dockerfile

En lugar de realizar compilaciones manuales dentro del contenedor, puedes definir un Dockerfile que automatice:

  • Copiar el código.
  • Ejecutar la compilación.
  • Generar una imagen final con el artefacto listo para ejecución o distribución.

Esto mejora reproducibilidad y simplifica despliegue.

7.2 Manejo de dependencias

Los contenedores mantienen las dependencias encapsuladas. Esto evita problemas clásicos como conflictos de versión o dependencias faltantes. Además, acelera el onboarding de nuevos desarrolladores que solo deberán tener Docker instalado.

7.3 Seguridad y permisos

Configura correctamente los permisos de los volúmenes para evitar bloqueos o alteraciones inesperadas del código y binarios. Además, verifica la confianza de las imágenes que usas para impedir problemas de seguridad.

8. Integración con flujos DevOps y CI/CD

La compilación con contenedores encaja perfectamente en pipelines de integración continua / entrega continua (CI/CD).

Al definir workflows automáticos en plataformas como Jenkins, GitHub Actions o GitLab CI, los contenedores de compilación aseguran que el proceso sea uniforme, evitando errores humanos y facilitando auditoría y rastreabilidad.

Para profundizar más sobre estas técnicas y ver un ejemplo práctico en vídeo, te invitamos a revisar este contenido que complementa esta guía paso a paso.

Introducción completa para empezar a trabajar con contenedoresIntroducción completa para empezar a trabajar con contenedores

9. Glosario y palabras clave relacionadas con compilación en contenedores

Docker: Plataforma para ejecutar contenedores. Su uso permite encapsular entornos de desarrollo y producción.

Contenedor: Unidad ligera que incluye código, dependencias y configuraciones necesarias para ejecutar una tarea o aplicación.

SDK (Software Development Kit): Conjunto de herramientas para compilar, depurar y desarrollar aplicaciones en un lenguaje específico.

Volumen Docker: Mecanismo para compartir carpetas o archivos entre el host y el contenedor, permitiendo sincronización de datos.

Compilación: Proceso de traducir código fuente legible por humanos a código ejecutable o bytecode.

Entorno de ejecución: Componentes mínimos necesarios para que un programa compilado se ejecute correctamente.

Windows Containers: Contenedores que ejecutan aplicaciones Windows nativas, necesarios para compilar y correr binarios Windows en Docker.

WSL2: Subsistema de Windows para Linux, que permite correr contenedores Linux en Windows.

CI/CD: Prácticas que automatizan la integración y distribución de software, donde los contenedores aportan consistencia y reproducibilidad.

Buenas prácticas: Conjunto de recomendaciones para maximizar la productividad, seguridad y calidad del proceso de desarrollo y compilación.

10. Preguntas frecuentes (FAQ)

¿Cómo ejecutar código en un contenedor Docker?

Para ejecutar varios comandos dentro de un contenedor usando docker exec, se puede utilizar el parámetro -c seguido de los comandos separados por punto y coma. Por ejemplo:

docker exec -it nombre_contenedor sh -c "command1; command2; command3"

Esto ejecutará los comandos secuencialmente dentro del contenedor.

Operaciones básicas con contenedores para empezar a trabajar fácilOperaciones básicas con contenedores para empezar a trabajar fácil

¿Cómo iniciar un contenedor Docker?

Para iniciar un contenedor que ejecute un shell interactivo, el comando es:

docker run -it nombre_imagen sh

Si quieres ejecutar un contenedor y pasarle comandos no interactivos puedes usar:

docker run nombre_imagen comando

En este último caso, el contenedor se ejecuta, procesa el comando y termina.

¿Cuánto se tarda en aprender Docker?

El tiempo de aprendizaje de Docker varía según el nivel deseado. Para un desarrollador con experiencia, dominar conceptos básicos funcionales puede tomar unos días, mientras que profundizar en orquestación, redes y almacenamiento puede requerir semanas o meses.

Lo importante es practicar creando imágenes, contenedores y familiarizarse con volúmenes y comandos comunes.

¿Cómo crear un contenedor Docker para compilación?

Ya sea para C#, Java o C++, puedes usar imágenes oficiales del SDK que contienen compiladores. El flujo general es:

  1. Descargar la imagen SDK con docker pull.
  2. Ejecutar contenedor con montaje de código fuente.
  3. Ejecutar el comando de compilación dentro del contenedor.
  4. Salir del contenedor y usar los binarios generados.

¿Qué ventajas ofrece usar imágenes oficiales del SDK?

Las imágenes oficiales están actualizadas, son mantenidas por los proveedores y aseguran que el entorno de compilación sea consistente. Esto reduce problemas de incompatibilidad y facilita automatización.

¿Puedo usar contenedores para compilar proyectos multiplataforma?

Sí, usando contenedores específicos por plataforma (Linux, Windows). Para Windows en Docker Desktop es necesario cambiar el modo a contenedores Windows. Esto permite generar ejecutables compatibles con el sistema destino.

¿Qué hacer si el binario generado no se ejecuta en mi máquina?

Esto ocurre cuando el contenedor y el host tienen diferentes sistemas operativos. Por ejemplo, binarios Linux no se ejecutan en Windows. La solución es usar contenedores del SDK para la plataforma correcta o compilar en entornos compatibles.

¿Cómo mantener el código actualizado dentro del contenedor?

Usa volúmenes para montar el directorio local en el contenedor. Cualquier cambio que hagas en el host estará inmediatamente accesible dentro del contenedor sin necesidad de copiar manualmente.

11. Conclusión

Adoptar contenedores para el proceso de compilación de tus proyectos en lenguajes compilados no solo simplifica tu entorno local, sino que aporta consistencia, calidad y escalabilidad a tu desarrollo. Desde la descarga sencilla de imágenes oficiales hasta la ejecución rápida de compilaciones sin configurar SDKs en cada máquina, las ventajas son claras.

Además, tener en cuenta las diferencias de plataforma entre Linux y Windows garantiza que el binario final sea compatible y funcional en el entorno deseado. La integración de este modelo en pipelines de CI/CD potencia aún más su valor al automatizar y asegurar el proceso.

Cómo ejecutar tests unitarios y trabajar con contenedores eficientementeCómo ejecutar tests unitarios y trabajar con contenedores eficientemente

¿Querés mantenerte actualizado con las últimas tendencias en automatización, inteligencia artificial y transformación digital? Visitá nuestro blog de Código6 y descubrí guías, casos de éxito y noticias relevantes para potenciar tu empresa. Ingresá al blog y explorá los recursos más recientes.

Share

Leave A Comment

Descubre el poder de la IA

Sumérgete en una experiencia transformadora hacia el futuro de la innovación, explorando el potencial ilimitado de la inteligencia artificial en cada interacción.

Impulsa tu empresa con automatización, inteligencia artificial, desarrollo web y SEO técnico. Descubre la transformación digital con Código6.

© 2025 Codigo6 Todos los derechos reservados.