Dockerizar una app Rust para Heroku

Resumen

Llevar tu primera aplicación web en Rust a producción es más fácil cuando entiendes cómo dockerizar una aplicación Rust y subirla a Heroku. Aquí aprenderás a construir una imagen Docker optimizada con multi-stage build, configurar variables de entorno y dejar tu proyecto listo para desplegarse en la nube sin tarjeta de crédito.

Por qué usar Heroku para desplegar un proyecto Rust

Heroku es una opción gratuita que no exige tarjeta de crédito ni requisitos complicados, y ofrece bases de datos integradas que facilitan el despliegue. Si buscas alternativas, los tres grandes son Google Cloud Platform, AWS y Azure, pero Heroku gana por simplicidad cuando recién empiezas.

¿Qué significa dockerizar una aplicación? Es crear una imagen de Docker que empaqueta tu código, dependencias y entorno de ejecución en un contenedor portable. Esa imagen es la que subirás a Heroku para que tu app funcione igual en cualquier servidor.

Cómo escribir el Dockerfile para una app en Rust

El archivo Dockerfile va al mismo nivel que tu Cargo.toml, con la D en mayúscula. La estrategia es usar dos etapas: una para compilar y otra para ejecutar solo el binario final, lo que reduce muchísimo el peso de la imagen.

Qué incluye la primera etapa de compilación

La imagen base es Ubuntu 18.04. Sobre ella se actualizan dependencias e instalas paquetes esenciales como curl y certificados SSL. Después instalas Rust con el mismo comando con el que iniciaste tu travesía y agregas Rust al path del sistema [03:00].

Luego defines el directorio de trabajo con workdir app, copias todo el código fuente y ejecutas un cargo build en modo release. Este paso compila el proyecto y deja los binarios listos, pero sin correr la aplicación.

Cómo optimizar la imagen con multi-stage build

Como Rust es un lenguaje compilado, no necesitas arrastrar todo el código fuente a la imagen final. Solo importa el binario. Por eso creas una segunda imagen que repite la base de Ubuntu y los paquetes, define workdir app y copia únicamente lo necesario desde la primera etapa.

  • COPY --from=0 para traer el archivo .env desde el contenedor anterior.
  • COPY de target/release con el nombre de tu proyecto, por ejemplo blog Platzi.
  • COPY de la carpeta templates desde tu máquina, ya que no cambia.
  • CMD apuntando al binario final para ejecutar la app.

Cómo construir y correr la imagen Docker

Una vez listo el Dockerfile, construyes la imagen con docker build -t web:latest seguido de un punto, que indica que se trabaja sobre toda la carpeta actual [07:30]. La primera compilación tarda más porque genera todas las librerías desde cero.

Por qué necesitas un archivo dockerignore

Si no excluyes ciertos archivos, Docker subirá carpetas pesadas e innecesarias como target. La solución es crear un archivo dockerignore al mismo nivel del Dockerfile y agregar dos entradas:

  • target, porque se regenera dentro del contenedor.
  • Cargo.lock, ya que solo necesitas subir el Cargo.toml.

¿Para qué sirve dockerignore? Funciona como un gitignore pero para Docker: evita que archivos pesados o innecesarios se incluyan al construir la imagen, haciendo el build más rápido y la imagen más liviana.

Cómo manejar el puerto con variables de entorno

Dentro del archivo .env defines la variable port con el valor que prefieras. Desde main.rs traes esa variable de entorno y la parseas a un entero de 16 bits con esta línea: let port: u16 = port.parse().unwrap(). Así tu aplicación lee dinámicamente el puerto donde debe escuchar [11:45].

Para correr el contenedor usas docker run -d con el nombre del proyecto, el flag de debug y el binding del puerto del host al puerto del contenedor. Al ejecutarlo, Docker devuelve un hash identificador y tu servidor arranca en unos segundos.

Cómo verificar que el contenedor funciona correctamente

Después de lanzar docker run, el servidor tarda unos instantes en estar disponible. Si entras a localhost con el puerto que asignaste, por ejemplo el 8007, deberías ver tu blog funcionando exactamente igual que en desarrollo local [13:20].

Con la imagen construida y probada localmente, ya tienes todo lo necesario para el siguiente paso: usar el cliente de Heroku y publicar tu proyecto Rust en internet. ¿Qué nombre le pusiste a tu imagen Docker? Cuéntalo en los comentarios.