Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,51 @@
import org.testcontainers.DockerClientFactory;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

@Slf4j
public class DockerClientConfigUtils {

// See https://github.com/docker/docker/blob/a9fa38b1edf30b23cae3eade0be48b3d4b1de14b/daemon/initlayer/setup_unix.go#L25
public static final boolean IN_A_CONTAINER = new File("/.dockerenv").exists();
public static final boolean IN_A_CONTAINER = detectInContainer();

private static boolean detectInContainer() {
// Common indicators for being inside a containerized environment:
// - Docker: /.dockerenv
// - Podman / container tools: /run/.containerenv
// - Kubernetes: presence of KUBERNETES_SERVICE_HOST
// - cgroup hints: entries containing docker/kubepods/containerd/podman
if (new File("/.dockerenv").exists()) {
return true;
}
if (new File("/run/.containerenv").exists()) {
return true;
}
if (System.getenv("KUBERNETES_SERVICE_HOST") != null) {
return true;
}
try {
byte[] content = Files.readAllBytes(Paths.get("/proc/1/cgroup"));
String cgroup = new String(content, StandardCharsets.UTF_8).toLowerCase();
if (
cgroup.contains("docker") ||
cgroup.contains("kubepods") ||
cgroup.contains("containerd") ||
cgroup.contains("podman")
) {
return true;
}
} catch (IOException ignored) {
// ignore and fall back to false
}
return false;
}

@Getter(lazy = true)
private static final Optional<String> defaultGateway = Optional
Expand Down