Java应用程序如何知道它在Docker容器中运行[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java应用程序如何知道它在Docker容器中运行[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我为我的应用程序编写了一个DockerFile,主要是为了让它能够在NAS机器上运行(通过Docker)。 Web界面允许用户遍历文件系统树以查找音乐文件,但是当使用Docker时,文件系统树是无关紧要的,除了/ Music卷,它是NAS上用户实际Music文件夹的安装点。
所以我只想显示/ Music文件夹而不是整个文件系统树,为此,应用程序需要知道它实际上是在Docker而不是实际的本机Linux操作系统中运行。
应用程序知道它的正确方法是在docker中,应用程序是用Java编写的。
解
只需通过/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
- 码头外:running outside docker
- 在码头工人:running inside docker
更多信息
- 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
当您运行容器时,添加volume
选项。
docker run -v /Music:/Music <image-name>
右侧:是应用程序查找目录的位置。我以为是/音乐。
如果你真的想检查你的应用程序是否在docker中运行,你可以检查是否存在文件“/.dockerenv”。根据您的问题,您应该知道的一件事是,当您的应用程序在docker中运行时,除非您通过卷提供访问权限,否则它无法访问主机的文件系统。因此,如果您的真正的Linux机器有一个目录/音乐,您的应用程序无法访问它。您可以通过--volume
进入。当您在docker中运行应用程序时,您可以将其视为在其他VM或计算机上运行以实现所有实际目的。这是Docker本身的主要目的:提供隔离。
以上是关于Java应用程序如何知道它在Docker容器中运行[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Java 读取 parquet 文件,但它在本地机器上工作,在 docker 容器中不工作
如何将节点 docker 容器与 postgres docker 容器连接起来