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