Java应用程序如何知道它在Docker容器中运行[重复]

问题描述 投票:1回答:2

这个问题在这里已有答案:

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

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

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

java docker dockerfile
2个回答
2
投票

只需通过/proc/1/cgroup检查init进程的控制组。

  • 如果它正常启动,则所有层次结构都具有/
  • 如果它是从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告诉我的那样,如果您在亚马逊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;
        }
    }

Live code checking


更多信息


-1
投票

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

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

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

如果你真的想检查你的应用程序是否在docker中运行,你可以检查是否存在文件“/.dockerenv”。根据您的问题,您应该知道的一件事是,当您的应用程序在docker中运行时,除非您通过卷提供访问权限,否则它无法访问主机的文件系统。因此,如果您的真正的Linux机器有一个目录/音乐,您的应用程序无法访问它。您可以通过--volume进入。当您在docker中运行应用程序时,您可以将其视为在其他VM或计算机上运行以实现所有实际目的。这是Docker本身的主要目的:提供隔离。

© www.soinside.com 2019 - 2024. All rights reserved.