Logs de Kubernetes con Grafana Loki y Promtail
Chef vs Puppet vs Ansible vs Saltstack

Contenerizar una aplicación Python con Paketo Buildpacks

Paketo Buildpacks

La creación de Dockerfiles puede ser un desafío, incluso los más simples. Un método alternativo para contenerizar una aplicación puede ser Paketo Buildpacks.

Los contenedores ya se llevan utilizado con docker desde hace una década, pero contenerizar aplicaciones aún puede plantear desafíos. En concreto, los Dockerfiles, los fichero que dictan cómo se construyen las imágenes de los contenedores, pueden ser difíciles de escribir correctamente. Un estudio encontró que casi el 84% de los proyectos que analizaron tenían «smells» (problemas de calidad) en sus Dockerfiles.

En este artículo mostraré un método alternativo a los Dockerfiles para contenerizar una aplicación, siguiendo las mejores prácticas, con un solo comando. Antes de empezar con esta técnica, veamos primero las dificultades asociadas con la contenerización de aplicaciones utilizando enfoques tradicionales.

Si quieres saber más de Python puedes revisar estos enlaces:

PDF de apuntes Python

Repo con apuntes de cursos de Python

Es difícil escribir buenos Dockerfiles – ¿Qué tiene de difícil Dockerfiles?

  1. Es un arte: escribir buenos Dockerfiles requiere conocimientos profundos y experiencia. Hay una serie de mejores prácticas que se deben implementar para cada Dockerfile. Los desarrolladores, que generalmente son quienes los escriben, pueden no tener los conocimientos o recursos para hacerlo correctamente.
  2. Seguridad: pueden representar una amenaza para la seguridad si no se escriben correctamente. Por ejemplo, un problema común en los Dockerfiles es que a menudo utilizan el usuario root en sus instrucciones, lo cual puede crear vulnerabilidades de seguridad y permitir que un atacante obtenga el control total sobre el sistema host.
  3. No son nativamente rápidos: lograr un tiempo de construcción rápido requiere trabajo, desde asegurarse de utilizar imágenes base mínimas, minimizar el número de capas, utilizar el almacenamiento en caché de compilación y configurar una compilación de múltiples etapas.

Aprender cómo crear el Dockerfile perfecto puede ser divertido cuando se trabaja con una o dos imágenes. Sin embargo, la emoción disminuye a medida que aumenta el número de imágenes, lo que requiere una gestión en múltiples repositorios, proyectos y pilas, así como un mantenimiento constante. Aquí es donde el proyecto de código abierto Paketo Buildpacks ofrece una solución.

Una forma más sencilla

Antes de adentrarnos en el tutorial, vamos a hablar sobre el concepto de Buildpacks, un proyecto de código abierto mantenido por la Cloud Native Computing Foundation.

Desarrollados por Heroku, los Buildpacks transforman el código fuente de la aplicación en imágenes que pueden ejecutarse en cualquier plataforma en la nube. Analizan el código, identifican lo que se necesita para construir y ejecutar el software, y luego ensamblan todos los componentes en una imagen. Al examinar las aplicaciones, los Buildpacks determinan las dependencias necesarias y las configuran en una serie de capas, creando finalmente una imagen de contenedor. Los Buildpacks también cuentan con mecanismos de optimización para reducir el tiempo de construcción.

Si bien el proyecto Cloud Native Buildpacks ofrece una especificación para los Buildpacks, no proporciona Buildpacks listos para usar; eso es lo que ofrecen los Paketo Buildpacks. Este proyecto impulsado por la comunidad desarrolla Buildpacks listos para producción.

Los Paketo Buildpacks se adhieren a las mejores prácticas para cada ecosistema de lenguaje, y actualmente admiten Java, Go, Node.js, .NET, Python y PHP, entre otros. La comunidad aborda constantemente las vulnerabilidades en los tiempos de ejecución de los lenguajes y los paquetes del sistema operativo, lo que te ahorra el esfuerzo de monitorear las dependencias susceptibles.

Vamos a contenerizar una aplicación Python

Hay dos requisitos para usar este tutorial:

  1. Tener instalado Docker Desktop; aquí tienes una guía para instalarlo.
  2. Tener instalada la interfaz de línea de comandos (CLI) de Pack; aquí tienes una guía para instalarlo.

En este ejemplo, utilizaremos una aplicación Python. Proporciono una aplicación de muestra para probar, pero siéntete libre de usar la tuya propia.

git clone git@github.com:sylvainkalache/Containerize-Python-app-with-Paketo.git && cd Containerize-Python-app-with-Paketo

Una vez que estés en el directorio raíz de la aplicación, ejecuta el siguiente comando:

pack build my-python-app --builder paketobuildpacks/builder:base

¡Ese es el único comando que necesitas para crear una imagen! Ahora puedes ejecutarla como lo harías normalmente.

docker run -ti -p 5000:8000 -e PORT=8000 my-python-app

Ahora verifiquemos que la aplicación funcione correctamente ejecutando este comando en otra terminal:

curl 0:5000

output:

¡Hola mundo!

Puedes seguir desarrollando tu aplicación y, cada vez que necesites una nueva imagen, simplemente ejecuta el mismo comando de construcción (pack build). La ejecución inicial del comando puede llevar algo de tiempo, ya que necesita descargar la imagen paketobuildpacks/builder:base. Sin embargo, las iteraciones posteriores serán mucho más rápidas gracias a las funciones avanzadas de almacenamiento en caché implementadas por los autores de los buildpacks.

Otros beneficios de usar Paketo Buildpacks

Con el aumento de los estándares de seguridad, numerosas organizaciones de ingeniería han comenzado a depender de los SBOMs (software bill of materials) para mitigar el riesgo de vulnerabilidades en su infraestructura. Los Buildpacks ofrecen un enfoque sencillo para obtener información sobre el contenido de las imágenes a través de SBOMs estándar en tiempo de compilación, que los Buildpacks pueden generar en los formatos CycloneDX, SPDX y Syft JSON.

Puedes probarlo en tu imagen utilizando el siguiente comando:

pack sbom download my-python-app

Otro beneficio de utilizar Paketo Buildpacks es que se utilizan imágenes mínimas que contienen solo lo necesario. Por ejemplo, mientras que mi imagen basada en paketobuildpacks/builder:base tenía solo 295 MB, una imagen de Docker python:3 básica ya tiene 933 MB.

Conclusión

Aunque los Dockerfiles nos han servido bien, no son la forma más eficiente de utilizar el tiempo de un desarrollador. La necesidad de gestionar y mantener Dockerfiles puede ser significativa, especialmente con el auge de las microservicios y la arquitectura distribuida. Al utilizar Paketo Buildpacks, los desarrolladores pueden construir mejores imágenes de manera más rápida, lo que les brinda más tiempo para enfocarse en lo que agrega más valor a sus proyectos. ¿Y la mejor parte? Si bien utilizamos Python en este artículo, el mismo principio se puede aplicar a cualquier proyecto con cualquier pila de tecnología admitida.

Más apuntes

Invítame a un café con bitcoins:
1QESjZDPxWtZ9sj3v5tvgfFn3ks13AxWVZ

Bitcoins para café
También puedes invitarme a algo para mojar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Rellena este campo
Rellena este campo
Por favor, introduce una dirección de correo electrónico válida.
Tienes que aprobar los términos para continuar