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.
# 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
:
La cuenta máxima puede ser alterado mediante un argumento posicional, el cual debe ser un número:
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:
# 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
.
Dockerfile
El archivo Dockerfile
requerido
en este caso
es muy sencillo.
# 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
:
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:
Este paso debe:- descargar la imagen de Python pedida;
- crear la nueva imagen derivada
con el nombre
imagen-contador
y tagv1
; - 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:
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:
Se puede despertar al contenedor de nuevo:
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
: