有时候我们并不希望我们的服务跑在docker容器中,网上搜索了一下,找到了一种判断当前服务是否运行在docker中的方法

方法的原理
1
cat /proc/1/sched
  • 如果返回的结果为:systemd (1, #threads: 1),则说明环境为Linux;对于使用init的系统pid为1的进程为init

  • 如果是在docker容器内的话,以java服务为例:java (118925, #threads: 236),此时pid为1的进程为java

使用方法(以Java为例)
1
2
3
4
5
6
7
8
ProcessBuilder pb = new ProcessBuilder();
pb.command("cat", "/proc/1/sched");
Process start = pb.start();
try (Scanner sc = new Scanner(start.getInputStream())){
String pid1 = sc.nextLine();
Pattern pattern = Pattern.compile("\\b(systemd|init)(?=\\s\\()");
boolean notInContainer = pattern.matcher(pid1).find();
}