diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c2860c6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,73 @@ +# syntax=docker/dockerfile:1 + +# Comments are provided throughout this file to help you get started. +# If you need more help, visit the Dockerfile reference guide at +# https://docs.docker.com/engine/reference/builder/ + +################################################################################ +# Create a stage for building the application. + +ARG RUST_VERSION=1.89.0 +FROM rust:${RUST_VERSION}-slim-bullseye AS build +ARG TARGET=release +ARG APP_NAME=urls-txt +WORKDIR /app + +RUN rm /var/lib/dpkg/info/libc-bin.* && apt-get clean && apt-get update && apt install libc-bin + +# Build the application. +# Leverage a cache mount to /usr/local/cargo/registry/ +# for downloaded dependencies and a cache mount to /app/target/ for +# compiled dependencies which will speed up subsequent builds. +# Leverage a bind mount to the src directory to avoid having to copy the +# source code into the container. Once built, copy the executable to an +# output directory before the cache mounted /app/target is unmounted. +RUN --mount=type=bind,source=src,target=src \ + --mount=type=bind,source=Cargo.toml,target=Cargo.toml \ + --mount=type=bind,source=Cargo.lock,target=Cargo.lock \ + --mount=type=cache,target=/app/target/ \ + --mount=type=cache,target=/usr/local/cargo/registry/ \ + < Result<(), Box> { println!("USAGE: {} ", args[0]); Err("Incorrect arguments")? } + let urls_filename = args[1].clone(); - let config = spawn_blocking(|| std::fs::read_to_string("urls.txt")).await??; + let bind_address = match env::var("URLS_TXT_BIND_ADDRESS") { + Ok(addr) => addr, + Err(env::VarError::NotPresent) => "127.0.0.1:3000".to_string(), + Err(e) => { + println!("Failed to read environment variable URLS_TXT_BIND_ADDRESS: {e}"); + Err(e)? + } + + }; + + let config = spawn_blocking(move || std::fs::read_to_string(urls_filename)).await??; let mut urlmap = HashMap::new(); for url_pair in config.split('\n') { if url_pair.len() == 0 { @@ -105,7 +116,7 @@ async fn main() -> Result<(), Box> { let urlmap = Arc::new(urlmap); println!("Starting TCP Listener..."); - let listener = TcpListener::bind("127.0.0.1:3000").await?; + let listener = TcpListener::bind(&bind_address).await?; loop { let (socket, _addr) = listener.accept().await?; let urlmap = urlmap.clone();