diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..2c96eb1b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target/ +Cargo.lock diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..ba6b58b3 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,7 @@ +version: '3' + +services: + homepage: + build: ./homepage/ + ports: + - "8000:8000" diff --git a/homepage/Cargo.toml b/homepage/Cargo.toml new file mode 100644 index 00000000..3044fb88 --- /dev/null +++ b/homepage/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "homepage" +version = "0.1.0" +authors = ["Khue Doan "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +actix-web = "2.0" +actix-rt = "1.0" diff --git a/homepage/Dockerfile b/homepage/Dockerfile new file mode 100644 index 00000000..298b285b --- /dev/null +++ b/homepage/Dockerfile @@ -0,0 +1,25 @@ +FROM rust:1.44.1-slim AS base + +ENV USER=root + +WORKDIR /usr/local/src/homepage/ + +RUN cargo init +COPY ./Cargo.toml ./Cargo.toml +RUN cargo fetch + +COPY ./src/ ./src/ + +CMD [ "cargo", "test", "--offline" ] + +FROM base AS builder + +RUN cargo build --release --offline + +FROM rust:1.44.1-slim + +COPY --from=builder /usr/local/src/homepage/target/release/homepage /usr/local/bin/homepage + +EXPOSE 8000 + +ENTRYPOINT [ "/usr/local/bin/homepage" ] diff --git a/homepage/src/main.rs b/homepage/src/main.rs new file mode 100644 index 00000000..c2421b90 --- /dev/null +++ b/homepage/src/main.rs @@ -0,0 +1,18 @@ +use actix_web::{web, App, HttpRequest, HttpServer, Responder}; + +async fn greet(req: HttpRequest) -> impl Responder { + let name = req.match_info().get("name").unwrap_or("World"); + format!("Hello {}!", &name) +} + +#[actix_rt::main] +async fn main() -> std::io::Result<()> { + HttpServer::new(|| { + App::new() + .route("/", web::get().to(greet)) + .route("/{name}", web::get().to(greet)) + }) + .bind("0.0.0.0:8000")? + .run() + .await +}