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

2020年9月30日 41点热度 0条评论

This question already has answers here:
How to check if a process is running inside docker container

(8个答案)

2年前关闭。

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

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

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

解决方案如下:

解决方案

只需通过/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;
            }
        }
    

    Live code checking

    更多信息

  • https://tuhrig.de/how-to-know-you-are-inside-a-docker-container/
  • How to determine if a process runs inside lxc/Docker?
  • How to check if a process is running inside docker container
  • 上一篇:java - 在Android中更改WiFi时如何使用已连接的WiFi SSID

    下一篇:clojure - 这个Clojure表格如何运作?从另一个列表中删除一个列表

    相关文章:

    for-loop - Java for循环无法执行

    java - 如何在Tomcat中调试 Realm 功能?

    java - 如何将参数传递给Windward Reports?

    macos - Mac Docker启动致命错误:子进程之一失败:com.docker.driver.amd64-linux -addr fd:3 -debug(pid:1375)

    bash - 在docker中运行时,请优雅地停止Solr

    java - 如何在Java中缓存一些只读xml文件

    selenium-webdriver - Webdriver异常(exception): “chrome not reachable”

    java - Docker + Java + OpenCV,java.library.path中没有opencv_java342

    python - Google Cloud VM-安装openCV

    docker - 如何在Google Cloud构建上传递替代变量以运行dockerfile