Java应用程序如何知道它正在Docker容器中运行

时间:2018-09-30 16:44:00

标签: java docker dockerfile

我为我的应用程序编写了一个DockerFile,主要是为了使其能够在NAS机器上运行(通过Docker)。 Web界面允许用户遍历文件系统树以查找音乐文件,但是当使用Docker时,文件系统树无关紧要,除了/ Music卷是用户在NAS上实际的Music文件夹的挂载点。

因此,我只想显示/ Music文件夹而不是整个文件系统树,并且应用程序需要知道它实际上是在Docker而不是实际的本机Linux OS中运行的。

应用程序使用Java编写的应用程序知道它在docker中的正确方法是什么。

2 个答案:

答案 0 :(得分:2)

解决方案

只需通过/proc/1/cgroup检查初始化过程的控制组。

  • 如果正常启动,则所有层次结构的值均为/
  • 如果它是从docker容器启动的,则它们的值为/docker/<container_id>

在docker /proc/1/cgroup内部运行时,其值类似于:

11:perf_event:/docker/897df2a033d6ab07c357c1ac1f75741bd16474487de83c6d4d98518e5ef52249
10:memory:/docker/897df2a033d6ab07c357c1ac1f75741bd16474487de83c6d4d98518e5ef52249
9:cpuset:/docker/897df2a033d6ab07c357c1ac1f75741bd16474487de83c6d4d98518e5ef52249
8:net_cls,net_prio:/docker/897df2a033d6ab07c357c1ac1f75741bd16474487de83c6d4d98518e5ef52249
7:pids:/docker/897df2a033d6ab07c357c1ac1f75741bd16474487de83c6d4d98518e5ef52249
6:cpu,cpuacct:/docker/897df2a033d6ab07c357c1ac1f75741bd16474487de83c6d4d98518e5ef52249
5:blkio:/docker/897df2a033d6ab07c357c1ac1f75741bd16474487de83c6d4d98518e5ef52249
4:freezer:/docker/897df2a033d6ab07c357c1ac1f75741bd16474487de83c6d4d98518e5ef52249
3:hugetlb:/docker/897df2a033d6ab07c357c1ac1f75741bd16474487de83c6d4d98518e5ef52249
2:devices:/docker/897df2a033d6ab07c357c1ac1f75741bd16474487de83c6d4d98518e5ef52249
1:name=systemd:/docker/897df2a033d6ab07c357c1ac1f75741bd16474487de83c6d4d98518e5ef52249

注意:正如@JanisKirsteins告诉我的那样,如果您在Amazon ec2中运行应用程序,则可能希望将条件更改为line.contains("/ecs")。因为在/proc/1/cgroups中您将找到类似于/ecs/<uuid>/<uuid>

的模式

在Java中

public static Boolean isRunningInsideDocker() {

        try (Stream < String > stream =
            Files.lines(Paths.get("/proc/1/cgroup"))) {
            return stream.anyMatch(line -> line.contains("/docker"));
        } catch (IOException e) {
            return false;
        }
    }
  

实时代码检查

     

更多信息

答案 1 :(得分:-1)

运行容器时,添加volume选项。

docker run -v /Music:/Music <image-name>

:的右侧是您的应用程序在其中查找目录的位置。我以为是/音乐。

如果您确实要检查应用程序是否在docker内部运行,则可以检查文件“ /.dockerenv”是否存在。根据您的问题,您应该知道的一件事是,当您的应用程序在docker内部运行时,它无法访问主机的文件系统,除非您通过卷进行访问。因此,如果您的真实linux计算机具有目录/ Music,则您的应用程序无权访问它。您通过--volume提供访问权限。在docker内部运行应用程序时,出于所有实际目的,您可以将其视为在另一台VM或机器中运行。那是Docker本身的主要目的:提供隔离。