Saltar a contenido

Primer demo

Se realiza una primera rutina para poner a prueba el funcionamiento de los contenedores.

Demo

Rutina original

En este ejemplo se implementó una rutina llamamda contar.py que cuenta hasta 10 esperando un segundo entre cuentas y entonces cierra.

Rutina original
# archivo 'contar.py'
from time import sleep
import sys


# salida por consola
try:
    # el numero maximo a contar se asigna como argumento
    n = int(sys.argv[1])
    print(f"Contando hasta {n}")

except Exception:
    # valor máximo por default en caso de error
    print("Argumento de entrada faltante o incorrecto (debe ser un entero)")
    n = 10
    print(f"Contando hasta {n} (valor default)")

finally:
    # el contador se incrementa cada 1 segundo
    i = 0
    while i <= n:
        print(f"i: {i:4}")
        sleep(1)
        i += 1

La rutina se implementó en un único archivo. No hay paquetes que requieran ser instalados.

Ejecución

El programa se ejecuta llamando al intérprete de Python e indicándole el nombre del archivo con la rutina, que en este ejemplo se llama contar.py:

Ejecutar - cuenta default
python contar.py

La cuenta máxima puede ser alterado mediante un argumento posicional, el cual debe ser un número:

Ejecutar - cuenta custom
python contar.py  4

Si hay más argumentos u opciones entonces éstos se ignoran.

Rutina adaptada

Se utiliza el logging y el lazy formatting en la rutina como reemplazo al print y los f-strings.

Este es el resultado:

Rutina adaptada
# archivo 'contar.py'
from time import sleep
import sys
import logging

# uso de la consola de logs
logging.basicConfig(
    level=logging.INFO, # mínimo nivel de log a publicar
    format="%(asctime)s - %(levelname)s - %(message)s", #info incorporada
    )

try:
    # el numero maximo a contar se asigna como argumento
    n = int(sys.argv[1])
    logging.info("Contando hasta %i", n)

except Exception:
    # valor máximo por default en caso de error
    logging.warning("Argumento de entrada faltante o incorrecto (debe ser un entero)")
    n = 10
    logging.warning("Contando hasta %i (valor default)", n)

finally:
    # el contador se incrementa cada 1 segundo
    i = 0
    while i <= n:
        logging.info("i: %4i",i)
        sleep(1)
        i += 1

Configuraciones

Estructura de archivos

En este ejemplo se ubican todas las rutinas del programa dentro de una carpeta llamada demo y a su lado se crean los archivos compose.yml y Dockerfile.

Arbol de archivos
.
├── demo
   └── contar.py
├── compose.yml
└── Dockerfile

Dockerfile

El archivo Dockerfile requerido en este caso es muy sencillo.

Dockerfile - básico
# imagen de base
FROM python:alpine

# directorio de trabajo (se crea automáticamente)
WORKDIR /code

# copia de rutinas al directorio de trabajo
COPY demo/ ./

# comando, opciones y argumentos (sobreescribibles)
CMD ["python", "contar.py", "4"]

No hizo falta instalar dependencias.

compose.yml

Para este ejemplo se crea un único servicio y se le indica que el Dockerfile es aledaño al archivo compose.yml:

compose.yml - construir imagen
name: contar-python

services:

  demo-contador:    # nombre de servicio - arbitrario
    # necesarios
    build: .        # Dockerfile en el mismo directorio
    # opcionales
    image: imagen-contador:v1
    container_name: contenedor-contador

También se aprovechó para etiquetar la nueva imagen y darle nombre al contenedor, pero esos pasos son meramente opcionales.

Despliegue

Se ordena la construcción y el despliegue del proyecto:

Proyecto - Construir y desplegar
cd ruta_proyecto
podman compose up --build
Este paso debe:

  • descargar la imagen de Python pedida;
  • crear la nueva imagen derivada con el nombre imagen-contador y tag v1;
  • crear el proyecto y su contenedor interno;
  • poner el contenedor en marcha.

Si todo salió bien debe observarse por consola los logs, algo parecido a:

Proyecto - Registro
contenedor-contador  | 2025-08-27 04:42:57,880 - INFO - Contando hasta 4
contenedor-contador  | 2025-08-27 04:42:57,880 - INFO - i:    0
contenedor-contador  | 2025-08-27 04:42:58,880 - INFO - i:    1
contenedor-contador  | 2025-08-27 04:42:59,881 - INFO - i:    2
contenedor-contador  | 2025-08-27 04:43:00,882 - INFO - i:    3
contenedor-contador  | 2025-08-27 04:43:01,882 - INFO - i:    4
contenedor-contador exited with code 0

Este mismo resultado debe repetirse instantáneamente al consultar los logs por terminal:

Proyecto - Consultar registro
podman compose logs

Se puede despertar al contenedor de nuevo:

Proyecto - Desplegar
podman compose up

y se verá que los nuevos registros se concatenenan tras los anteriores, sin borrarlos.

Para dar de baja (eliminar) el contenedor y todos sus logs internos simplemente usar el comando down:

Proyecto - Borrar
podman compose down