代码之家  ›  专栏  ›  技术社区  ›  Paul Taylor

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

  •  1
  • Paul Taylor  · 技术社区  · 6 年前

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

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

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

    2 回复  |  直到 6 年前
        1
  •  8
  •   MohammadReza Alagheband    6 年前

    检查init进程的控制组 /proc/1/cgroup .

    • 如果正常启动,则所有层次结构都具有 /
    • 如果是从docker容器启动的,则 /docker/<container_id> 价值观。

    在docker内部运行时 其值类似于:

    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告诉我的,如果您在amazonec2中运行应用程序,您可能需要将条件更改为 line.contains("/ecs") 相反。因为在 /proc/1/cgroups 您会发现模式类似于: /ecs/<uuid>/<uuid>


    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;
            }
        }
    

    实时代码检查


    更多信息

        2
  •  -1
  •   techtabu    6 年前

    运行容器时添加 volume

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

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

    如果您真的想检查应用程序是否在docker中运行,可以检查是否存在文件“/.dockerenv”。基于您的问题,您应该知道的一点是,当您的应用程序在docker中运行时,除非您通过卷授予访问权限,否则它无法访问主机的文件系统。因此,如果您真正的linux机器有一个目录/Music,那么您的应用程序就无法访问它。您可以通过 --volume . 当您在docker中运行应用程序时,您可以将其视为在其他VM或机器中运行。这就是Docker本身的主要目的:提供隔离。