[READ-ONLY] Mirror of https://github.com/FoxxMD/docker-proxy-filter. Filter the contents of Docker API responses
docker docker-socket-proxy filter
0

Configure Feed

Select the types of activity you want to include in your feed.

Parse env with envy/dotenvy

FoxxMD (Oct 8, 2025, 1:47 PM UTC) df07acf0 254dad53

+49 -63
+14 -4
Cargo.lock
··· 288 288 name = "docker-proxy-filter" 289 289 version = "0.1.0" 290 290 dependencies = [ 291 - "dotenv", 291 + "dotenvy", 292 + "envy", 292 293 "futures-util", 293 294 "http", 294 295 "log", ··· 307 308 ] 308 309 309 310 [[package]] 310 - name = "dotenv" 311 - version = "0.15.0" 311 + name = "dotenvy" 312 + version = "0.15.7" 312 313 source = "registry+https://github.com/rust-lang/crates.io-index" 313 - checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" 314 + checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 314 315 315 316 [[package]] 316 317 name = "encoding_rs" ··· 338 339 dependencies = [ 339 340 "env_filter", 340 341 "log", 342 + ] 343 + 344 + [[package]] 345 + name = "envy" 346 + version = "0.4.2" 347 + source = "registry+https://github.com/rust-lang/crates.io-index" 348 + checksum = "3f47e0157f2cb54f5ae1bd371b30a2ae4311e1c028f575cd4e81de7353215965" 349 + dependencies = [ 350 + "serde", 341 351 ] 342 352 343 353 [[package]]
+3 -2
Cargo.toml
··· 4 4 edition = "2024" 5 5 6 6 [dependencies] 7 - dotenv = "0.15.0" 7 + dotenvy = "0.15.7" 8 + envy = "0.4.2" 8 9 futures-util = "0.3.31" 9 10 http = "1.3.1" 10 11 log = {version = "0.4.28", features = ["kv","kv_std"] } ··· 25 26 strip = true # Automatically strip symbols from the binary. 26 27 opt-level = "z" # Optimize for size. 27 28 lto = true 28 - codegen-units = 1 29 + codegen-units = 1
+32 -57
src/main.rs
··· 15 15 use std::sync::{Arc, Mutex}; 16 16 17 17 use slog::{Drain}; 18 - use dotenv::dotenv; 19 - use std::env; 18 + use dotenvy; 20 19 use std::collections::HashMap; 21 20 use serde::{Deserialize, Serialize}; 22 21 use serde_json::Value; ··· 77 76 78 77 #[serde(flatten)] 79 78 extra: HashMap<String, Value>, 79 + } 80 + 81 + #[derive(Deserialize, Debug)] 82 + struct Config { 83 + proxy_url: String, 84 + container_names: Vec<String>, 85 + #[serde(default="default_scrub")] 86 + scrub_envs: bool, 87 + #[serde(default="default_port")] 88 + port: u16 89 + } 90 + 91 + fn default_scrub() -> bool { 92 + false 93 + } 94 + fn default_port() -> u16 { 95 + 2375 80 96 } 81 97 82 98 async fn forward( ··· 242 258 243 259 #[ntex::main] 244 260 async fn main() -> std::io::Result<()> { 245 - dotenv().ok(); 246 - 261 + let _ = dotenvy::dotenv(); 247 262 let decorator = slog_term::TermDecorator::new().build(); 248 263 let drain = slog_term::FullFormat::new(decorator).build().fuse(); 249 264 let drain = slog_async::Async::new(drain).build().fuse(); ··· 254 269 slog_scope::scope(&slog_scope::logger().new(o!("scope" => "1")), || ()); 255 270 let _log_guard = slog_stdlog::init().unwrap(); 256 271 257 - 258 - let mut proxy_url: String = String::new(); 259 - 260 - match env::var("PROXY_URL") { 261 - Ok(val) => { 262 - info!("PROXY_URL: {val}"); 263 - proxy_url.push_str(&val); 264 - }, 265 - Err(_) => { 266 - error!("Missing PROXY_URL"); 267 - panic!(); 268 - }, 269 - } 270 - 271 - let container_names: Vec<String>; 272 - 273 - match env::var("CONTAINER_NAMES") { 274 - Ok(val) => { 275 - container_names = val.split(',').map(|x| x.trim().to_string()).collect(); 276 - info!("CONTAINER_NAMES: {}", container_names.join(" | ")); 277 - }, 278 - Err(_) => { 279 - error!("Missing CONTAINER_NAMES"); 280 - panic!(); 281 - }, 282 - } 283 - 284 - let scub_env = match env::var("SCRUB_ENVS") { 285 - Ok(val) => { 286 - let truthy = val == "true"; 287 - info!("SCRUB_ENVS: {truthy}"); 288 - truthy 289 - }, 290 - Err(_) => { 291 - info!("SCRUB_ENVS: false"); 292 - false 293 - }, 294 - }; 295 - 296 - let mut port = 2375; 297 - 298 - match env::var("PORT") { 299 - Ok(val) => { 300 - match val.parse::<u16>() { 301 - Ok(p) => port = p, 302 - Err(e) => warn!("Could not parse PORT to int. Falling back to {}:{} {e}", &port, &e) 303 - } 304 - }, 305 - Err(_) => {}, 272 + let config = match envy::from_env::<Config>() { 273 + Ok(config) => { 274 + info!("{:#?}", config); 275 + config 276 + }, 277 + Err(error) => { 278 + error!("Could not parse envs correctly! {:#?}", error); 279 + panic!("Unable to start due to invalid envs") 280 + } 306 281 }; 307 282 308 283 let cm = AppStateWithContainerMap { 309 284 container_map: Arc::new(Mutex::new(HashMap::<String, Option<String>>::new())) 310 285 }; 311 286 312 - let forward_url = url::Url::parse(&proxy_url) 287 + let forward_url = url::Url::parse(&config.proxy_url) 313 288 .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidData, err))?; 314 289 web::server(move || { 315 290 web::App::new() 316 291 .state(http::Client::new()) 317 292 .state(forward_url.clone()) 318 - .state(container_names.clone()) 293 + .state(config.container_names.clone()) 319 294 .state(cm.clone()) 320 - .state(scub_env.clone()) 295 + .state(config.scrub_envs.clone()) 321 296 .wrap(web::middleware::Logger::default()) 322 297 .default_service(web::route().to(forward)) 323 298 }) 324 - .bind(("0.0.0.0", port))? 299 + .bind(("0.0.0.0", config.port))? 325 300 .run() 326 301 .await 327 302 }