Hace algún tiempo vengo escuchando sobre Rust, y la verdad es que estaba deseoso por hacer algunas cosas y probar que realmente valiera la pena. Por este motivo y ante la necesidad de un nuevo servicio en Binary Coffee, para gestionar los podcasts, me adentré en esta contienda.
El proyecto pueden encontrarlo en este repositorio (dcs-community/dcs-podcast-api) y es open source como todos los proyectos de la comunidad.
Es de esta manera como comencé y luego de tener el código base vino la necesidad de desplegar el servicio junto a todos las aplicaciones actuales de Binary Coffee.
Tener en cuenta también, que para este proyecto se utilizó el framework Rocket de Rust para crear la api REST. Por este motivo hay algunos pasos en la configuración que son necesarios y que pueden ser obviados según sus proyectos.
Lo primero es crear el archivo Dockerfile, con los siguientes datos:
# Dockerfile
FROM rust:1.45 AS build-container
# needed for run a rocket app
RUN rustup update nightly
RUN rustup default nightly
# setup dummie project
WORKDIR /build
RUN USER=root cargo new bc-podcast-api
WORKDIR /build/bc-podcast-api
# copying and installing the dependencies
COPY Cargo.toml Cargo.lock ./
RUN cargo fetch
# coping the app base code and build project
COPY src ./src
RUN cargo build --release
FROM debian:buster-slim
COPY --from=build-container /build/bc-podcast-api/target/release/bc-podcast-api .
USER 1000
CMD ["./bc-podcast-api"]
A continuación explicaremos paso a paso que hace cada línea del archivo Dockerfile
# Dockerfile
FROM rust:1.45 AS build-container
# needed for run a rocket app
RUN rustup update nightly
RUN rustup default nightly
En las primeras 6 líneas de configuración definimos la imagen de Rust que vamos a utilizar para compilar el proyecto y luego actualizamos a la versión nightly de Rust, dado que es necesario para la librería Rocket que se está utilizando en el proyecto.
# setup dummie project
WORKDIR /build
RUN USER=root cargo new bc-podcast-api
WORKDIR /build/bc-podcast-api
En las siguientes líneas, creamos un proyecto nuevo, para de esta manera, sobre el mismo, descargar las dependencias del proyecto actual.
# copying and installing the dependencies
COPY Cargo.toml Cargo.lock ./
RUN cargo fetch
A continuación reemplazamos los archivos de dependencias de Rust Cargo.toml y Cargo.lock, para a continuación descargar las dependencias del proyecto actual. Esta es una de las partes más importantes de la configuración, dado que separa las dependencias de la compilación del proyecto, ahorrando tiempo de despliegue en cada momento.
# coping the app base code and build project
COPY src ./src
RUN cargo build --release
Una vez hecho todo esto, resta copiar el código del proyecto y compilarlo para el despliegue.
FROM debian:buster-slim
COPY --from=build-container /build/bc-podcast-api/target/release/bc-podcast-api .
USER 1000
CMD ["./bc-podcast-api"]
Compilado el proyecto, solo resta utilizar una imagen de Docker más ligera en donde copiar y ejecutar el binario compilado del proyecto.
A continuación, y para simplificar la manera de levantar el servicio con docker, pueden utilizar una configuración como la siguiente, donde definimos el puerto del contenedor y las variables de entorno que utilizamos en la aplicación.
version: '3'
services:
deploy:
build:
context: .
restart: always
ports:
- '127.0.0.1:8000:8000'
environment:
- DB_PORT=${DB_PORT}
- DB_HOST=${DB_HOST}
- DB_NAME=${DB_NAME}
- JWT_SECRET=${JWT_SECRET}
Solo resta ejecutar el proyecto, y puden hacerlo de la siguiente manera:
$docker-compose up -d
Espero que estos simples pasos te sirvan para que de una manera fácil puedas configurar y levantar tus servicios desarrollados con Rust en Docker.
Happy coding!!!