use std::fs;
pub fn is_running_in_container() -> bool {
if std::path::Path::new("/.dockerenv").exists() {
return true;
}
if let Ok(cgroup) = fs::read_to_string("/proc/self/cgroup") {
if cgroup.contains("/docker/")
|| cgroup.contains("/containerd/")
|| cgroup.contains("/podman/")
|| cgroup.contains("/lxc/")
|| cgroup.contains("/kubepods/")
{
return true;
}
}
const CONTAINER_ENV_VARS: &[&str] = &[
"KUBERNETES_SERVICE_HOST",
"DOCKER_CONTAINER",
"container",
"PODMAN_CONTAINER",
];
if CONTAINER_ENV_VARS
.iter()
.any(|var| std::env::var(var).is_ok())
{
return true;
}
false
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_running_in_container_detects_the_container_env_vars() {
let test_cases = vec![
"KUBERNETES_SERVICE_HOST",
"DOCKER_CONTAINER",
"container",
"PODMAN_CONTAINER",
];
for var in test_cases {
std::env::set_var(var, "1");
let detected = is_running_in_container();
std::env::remove_var(var);
assert!(detected);
}
}
}