这个问题在这里已有答案:
我为我的应用程序编写了一个DockerFile,主要是为了让它能够在NAS机器上运行(通过Docker)。 Web界面允许用户遍历文件系统树以查找音乐文件,但是当使用Docker时,文件系统树是无关紧要的,除了/ Music卷,它是NAS上用户实际Music文件夹的安装点。
所以我只想显示/ Music文件夹而不是整个文件系统树,为此,应用程序需要知道它实际上是在Docker而不是实际的本机Linux操作系统中运行。
应用程序知道它的正确方法是在docker中,应用程序是用Java编写的。
解
只需通过/proc/1/cgroup
检查init进程的控制组。
/
值/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
更多信息
当您运行容器时,添加volume
选项。
docker run -v /Music:/Music <image-name>
右侧:是应用程序查找目录的位置。我以为是/音乐。
如果你真的想检查你的应用程序是否在docker中运行,你可以检查是否存在文件“/.dockerenv”。根据您的问题,您应该知道的一件事是,当您的应用程序在docker中运行时,除非您通过卷提供访问权限,否则它无法访问主机的文件系统。因此,如果您的真正的Linux机器有一个目录/音乐,您的应用程序无法访问它。您可以通过--volume
进入。当您在docker中运行应用程序时,您可以将其视为在其他VM或计算机上运行以实现所有实际目的。这是Docker本身的主要目的:提供隔离。