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)](https://github.com/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