]> source.dussan.org Git - gitblit.git/commitdiff
Detect and report if running in container
authorFlorian Zschocke <f.zschocke+git@gmail.com>
Thu, 9 Dec 2021 23:10:04 +0000 (00:10 +0100)
committerFlorian Zschocke <f.zschocke+git@gmail.com>
Thu, 9 Dec 2021 23:10:04 +0000 (00:10 +0100)
To help with analysis, try to detect if the instance is running inside
a container. Some containers are detected, but this is probably not
exhaustive. At least a Docker container should be detectable.
Report in the runtime manager to the log if a container was detected.

src/main/java/com/gitblit/manager/RuntimeManager.java
src/main/java/com/gitblit/utils/ContainerDetector.java [new file with mode: 0644]

index 18d6b9c20a95ef95cc03f4ccc3ca2b7379eb0844..f0cca51432cab7902868e930616267f6dea7bf58 100644 (file)
@@ -22,6 +22,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.TimeZone;
 
+import com.gitblit.utils.ContainerDetector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -78,6 +79,7 @@ public class RuntimeManager implements IRuntimeManager {
                logTimezone("App timezone: ", getTimezone());
                logger.info("JVM locale  : " + Locale.getDefault());
                logger.info("App locale  : " +  (getLocale() == null ? "<client>" : getLocale()));
+               ContainerDetector.report(logger, true);
                return this;
        }
 
diff --git a/src/main/java/com/gitblit/utils/ContainerDetector.java b/src/main/java/com/gitblit/utils/ContainerDetector.java
new file mode 100644 (file)
index 0000000..8e4a071
--- /dev/null
@@ -0,0 +1,74 @@
+package com.gitblit.utils;
+
+import org.slf4j.Logger;
+
+import java.io.File;
+
+/**
+ * The ContainerDetector tries to detect if the Gitblit instance
+ * is running in a container, or directly on the (virtualized) OS.
+ */
+public class ContainerDetector
+{
+    private static Boolean inContainer;
+    private static String detectedType = "";
+
+    /**
+     * Detect if this instance in running inside a container.
+     *
+     * @return true - if a container could be detected
+     *         false - otherwise
+     */
+    public static boolean detect()
+    {
+        if (inContainer == null) {
+            File proc = new File("/proc/1/cgroup");
+            if (! proc.exists()) inContainer = Boolean.FALSE;
+            else {
+                String cgroups = FileUtils.readContent(proc, null);
+                if (cgroups.contains("/docker")) {
+                    inContainer = Boolean.TRUE;
+                    detectedType = "Docker container";
+                }
+                else if (cgroups.contains("/ecs")) {
+                    inContainer = Boolean.TRUE;
+                    detectedType = "ECS container";
+                }
+                else if (cgroups.contains("/kubepod") || cgroups.contains("/kubepods")) {
+                    inContainer = Boolean.TRUE;
+                    detectedType = "Kubernetes pod";
+                }
+            }
+
+            // Finally, if we still haven't found proof, it is probably not a container
+            if (inContainer == null) inContainer = Boolean.FALSE;
+        }
+
+        return inContainer;
+    }
+
+
+    /**
+     * Report to some output if a container was detected.
+     *
+     */
+    public static void report(Logger logger, boolean onlyIfInContainer)
+    {
+        if (detect()) {
+            String msg = "Running in a " + detectedType;
+            if (logger == null) {
+                System.out.println(msg);
+            }
+            else logger.info(msg);
+        }
+        else if (!onlyIfInContainer) {
+            String msg = "Not detected to be running in a container";
+            if (logger == null) {
+                System.out.println(msg);
+            }
+            else logger.info(msg);
+
+        }
+
+    }
+}