Buenas prácticas y variables de entorno / puertos en el Dockerfile

Ya sabés armar un Dockerfile funcional. Ahora, algunas prácticas que hacen las imágenes más chicas, seguras y mantenibles.

ENV — variables de entorno

Definen variables de entorno disponibles dentro del contenedor, tanto en build como en runtime.

ENV PYTHONUNBUFFERED=1

EXPOSE — documentar el puerto

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

USER — no correr como root

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

Orden de las capas (cache de build)

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.

.dockerignore

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.

docker-compose (introducción)

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.

Ejercicios