Binary Coffee

Desplegar proyecto en Rust con Docker

binary coffee docker rust

驴Por qu茅 Rust?

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.

Configurando Docker

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

  1. # 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.

  2. # 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.

  3. # 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.

  4. # 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.

  5. 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.

Ejecutar el proyecto con docker-compose

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

Conclusiones

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!!!

Opiniones