我为我的应用程序编写了一个DockerFile,主要是为了使其能够在NAS机器上运行(通过Docker)。 Web界面允许用户遍历文件系统树以查找音乐文件,但是当使用Docker时,文件系统树无关紧要,除了/ Music卷是用户在NAS上实际的Music文件夹的挂载点。
因此,我只想显示/ Music文件夹而不是整个文件系统树,并且应用程序需要知道它实际上是在Docker而不是实际的本机Linux OS中运行的。
应用程序使用Java编写的应用程序知道它在docker中的正确方法是什么。
答案 0 :(得分:2)
解决方案
只需通过/proc/1/cgroup
检查初始化过程的控制组。
/
/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;
}
}
实时代码检查
- 外部docker:running outside docker
- 在docker内部:running inside docker
更多信息
答案 1 :(得分:-1)
运行容器时,添加volume
选项。
docker run -v /Music:/Music <image-name>
:的右侧是您的应用程序在其中查找目录的位置。我以为是/音乐。
如果您确实要检查应用程序是否在docker内部运行,则可以检查文件“ /.dockerenv”是否存在。根据您的问题,您应该知道的一件事是,当您的应用程序在docker内部运行时,它无法访问主机的文件系统,除非您通过卷进行访问。因此,如果您的真实linux计算机具有目录/ Music,则您的应用程序无权访问它。您通过--volume
提供访问权限。在docker内部运行应用程序时,出于所有实际目的,您可以将其视为在另一台VM或机器中运行。那是Docker本身的主要目的:提供隔离。