Un ejemplo práctico de cómo configurar los ambientes de desarrollo y producción en un proyecto de FastAPI usando Docker y Docker Compose. Primero configuramos nuestro archivo Dockerfile para el ambiente de desarrollo:
# Configuración Dockerfile para entorno de desarrollo
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]
Este Dockerfile usa la imagen base tiangolo/uvicorn-gunicorn-fastapi:python3.8 y configura el directorio de trabajo en /app. A continuación, copia el archivo requirements.txt e instala las dependencias con pip. Finalmente, copia todo el código fuente de la aplicación y lo ejecuta con Uvicorn, en modo de desarrollo (--reload) y en el puerto 8000.
Para el ambiente de producción, usaremos una imagen diferente y algunos cambios en la configuración. Este es el archivo Dockerfile para producción:
# Configuración Dockerfile para entorno de producción
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
En este caso, usamos la imagen tiangolo/uvicorn-gunicorn-fastapi:python3.8-slim, que tiene una versión reducida del sistema operativo y del conjunto de herramientas instaladas para reducir el tamaño de la imagen. Además, eliminamos la opción --reload para evitar reiniciar la aplicación en caso de cambios en el código. Finalmente, configuramos el puerto en 80, el puerto por defecto para HTTP.
Ahora definimos el archivo docker-compose.yml para orquestar los contenedores de ambas imágenes y ejecutar nuestra aplicación. Aquí está una configuración de ejemplo:
version: "3.8"
services:
app:
container_name: myapp
restart: unless-stopped
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "8000:8000"
volumes:
- .:/app
prod:
container_name: myapp_prod
restart: unless-stopped
build:
context: .
dockerfile: Dockerfile
ports:
- "80:80"
Este archivo define dos servicios: app para el ambiente de desarrollo y prod para el ambiente de producción. Para el servicio app, se construye la imagen desde el archivo Dockerfile.dev y se mapea el puerto local 8000 al puerto 8000 del contenedor. Además, se crea un volumen para que Docker actualice automáticamente el código fuente cuando se realicen cambios locales. Para el servicio prod, se construye la imagen desde el archivo Dockerfile y se mapea el puerto local 80 al puerto 80 del contenedor.
Con estos archivos, podemos ejecutar nuestra aplicación en ambiente de desarrollo usando el comando docker-compose up app y en ambiente de producción usando docker-compose up prod. Espero que este ejemplo te haya ayudado a ver cómo configurar ambientes de desarrollo y producción en FastAPI con Docker y Docker Compose.