Construir la imagen del contenedor de la aplicación usando Buildpacks
Escrito por
el .
java
planeta-codigo
programacion
Enlace permanente
Comentarios
Los sistemas y servicios son significativamente complejos por sí mismos, además en sistemas que se componen de varios de ellos cada uno con sus diferencias añade más complejidad al sistema. Eliminar toda la complejidad posible y simplificar el sistema es algo deseable. La herramienta Buildpacks aplica a la construcción de las aplicaciones lo que los contenedores aplican en tiempo de ejecución de las mismas, uniformizando las aplicaciones independientemente del lenguaje y plataforma que usen.
Los contenedores son una gran tecnología ya que hace muy simple ejecutar servicios independientemente de cómo están implementados y en qué lenguaje, uniformizan los procesos a ejecutar y tratarlos a todos de la misma forma y con la misma herramienta.
Al igual que en los barcos los contenedores facilitan transportar mercancías, en el ámbito de la tecnología los contenedores simplifican mucho la infraestructura en tiempo de ejecución permitiendo tratar los servicios de forma uniforme.
Los contendores se basan en una imagen y una herramienta que los ejecuta, una de las herramientas más conocidas para ejecutar contenedores es Docker y el archivo con las instrucciones para construir las imágenes son los archivos Dockerfile.
Es muy útil poder ejecutar procesos de forma uniforme independientemente del lenguaje y de forma aislada con todas las dependencias del entorno dentro de la imagen lo que permite ejecutar tantos servicios como se deseen sin que las dependencias de estos entre en conflicto.
La misma utilidad y propiedades de los contenedores en tiempo de ejecución es deseable en el momento de construcción de las imágenes de los servicios.
Contenido del artículo
La herramienta Buildpacks
La herramienta Buildpacks analiza el código fuente y permite construir imágenes de contenedores compatible con OCI con la misma herramienta independientemente del lenguaje o plataforma que utilice y sin utilizar archivos Dockerfile. Además, permite reutilizar las instrucciones de construcción sin tener que implementarlas.
Los buildpacks son los módulos que añaden el soporte e implementan las instrucciones para construir las imágenes. Hay un buildpack específico según una necesidad de construcción, una aplicación puede necesitar varios buildpacks al mismo tiempo.
Por ejemplo, una aplicación Java necesita una versión de la JVM para ejecutarse que es proporcionado por un buildpack, si la aplicación utiliza Gradle como herramienta de construcción hay un nuildpack para construir aplicaciones Gradle. Y hay buildpacks para Java, Node, Python y otros lenguajes.
Los conceptos que usa Buildpacks son:
- Builder: es la imagen del contenedor con la que se realiza la construcción, contiene todos los componentes necesarios junto con los buildpacks para ejecutar la construcción.
- Buildpack: es el ejecutable que construye y ejecuta la aplicación. Al realizar la construcción contribuye los archivos necesarios a la imagen del contenedor resultante.
- Lifecycle: orquesta la construcción con los buildpacks y ensambla los artefactos resultantes en la imagen del contenedor.
- Stack: se compone de dos imágenes de contenedor, la imagen builder que proporciona la imagen para realizar la construcción y la imagen run que proporciona la imagen para la ejecución.
Buildpacks es extensible y es posible crear y usar builders y buildpaks propios ajustados a las necesidades de la organización o aplicación si los existentes no son suficientes.
El proyecto Paketo
Paketo es un proyecto de código abierto que proporciona numerosos buildpacks para diferentes lenguajes de las aplicaciones más populares entre los que por supuesto están Java, Node, Python y Go entre otros.
En el proyecto de GitHub de Paketo están los diferentes repositorios de los buildpacks junto con sus opciones de configuración y código fuente, además proporciona varios builder basados en diferentes versiones de Ubuntu.
Instalación de Buildpacks
Hay varias formas de instalación de Buildpacks según el sistema operativo que se use, junto a varias formas de instalación usando el gestor de paquetes nativo del sistema operativo o una instalación manual en el sistema.
Builpacks es una herramienta programada en el lenguaje Go que una de sus ventajas es que generan un único binario que incluye todas las dependencias con lo que su instalación manual es muy sencilla, basta con descargar y copiar un único archivo.
En GNU/Linux basta descargar el paquete de distribución para este sistema operativo, descomprimirlo e instalar el binario en el path del sistema de modo que al ejecutar el comando el intérprete del shell lo encuentre. En GNU/Linux el directorio /usr/local/bin permite añadir al sistema comandos adicionales sin que entren en conflicto con los que se instalan a través de paquetes de la distribución.
|
|
Construcción de la imagen del contenedor
Utilizando una aplicación escrita con Java con Gradle como herramienta de construcción y que usa Spring Boot, el comando para construir la imagen OCI del contenedor es el siguiente.
|
|
Los builpacks permiten ser configurados a través de las variables de entorno, en el comando es posible configurar el buildpack de adoptioum para que use la versión de Java que se desee o el tipo de máquina virtual, distribución JDK o JRE. En el archivo README.md de cada uno de los buildpacks están documentados las variables de entorno con su descripción y en algunos casos sus valores.
El comando especifica los buildpacks ya que el builder utilizado no incluye ninguno. En el parámetro path se indica la ruta al código fuente de la aplicación.
El buildpack paketo-buildpacks/procfile permite especificar diferentes comandos de ejecución en un archivo. El entrypoint que añade el builder en la imagen permite especificar el proceso a iniciar en el comando de ejecución del contenedor.
Ejecución del contenedor con Docker
Docker permite almacenar en local y ejecutar las imágenes construidas con Buildpacks como un contenedor normal. El comando para iniciar la aplicación es el siguiente que inicia el proceso por defecto de la imagen.
|
|
|
|
Los buildpacks añaden un launcher que permite varias formas de ejecutar el contenedor de la aplicación. También es posible especificar otro proceso de la imagen con la opción –entrypoint y el nombre del proceso.
|
|
A veces interesa iniciar una shell para inspeccionar el sistema de archivos del contenedor y ejecutar procesos manualmente. En este ejemplo se muestra la versión de Ubuntu que forma la imagen base del contenedor y se aprecia que está basada en la versión 22.04.
|
|
|
|
Finalmente, es posible inspeccionar la imagen del contenedor sin iniciarlo para obtener información acerca de cómo se ha construido.
|
|
|
|
El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:./pack-build.sh