Ya sabés armar un Dockerfile funcional. Ahora, algunas prácticas que hacen las imágenes más chicas, seguras y mantenibles.
Definen variables de entorno disponibles dentro del contenedor, tanto en build como en runtime.
ENV PYTHONUNBUFFERED=1
Indica qué puerto usa la aplicación dentro del contenedor. Es
documentación (no publica el puerto por sí solo; eso lo hace docker run
-p).
EXPOSE 5000
Por defecto los contenedores corren como root. Por seguridad, es buena práctica crear y usar un usuario sin privilegios cuando sea posible.
USER appuser
Docker cachea cada capa (instrucción). Conviene poner primero lo que cambia
menos (por ejemplo, copiar requirements.txt e instalar
dependencias) y al final lo que cambia más seguido (el código fuente). Así,
si solo cambiás el código, Docker no tiene que reinstalar dependencias de
nuevo.
Igual que .gitignore, permite excluir archivos del contexto
de build (por ejemplo __pycache__, .git, entornos
virtuales) para imágenes más chicas y builds más rápidos.
Cuando una aplicación necesita varios contenedores (por ejemplo, una app
web + una base de datos), escribir todos los docker run a mano
es tedioso. docker-compose permite describir todos los
servicios en un único archivo YAML (docker-compose.yml) y
levantarlos juntos con un solo comando: docker compose up.
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: ejemplo
Esto es solo una introducción conceptual: en este módulo no se validan
archivos docker-compose.yml, pero es importante saber que existe
y para qué sirve antes de seguir aprendiendo Docker en profundidad.