Docker镜像能否使用主机上的可执行文件?

5

我有几个Java服务,每个服务都打包成单独的jar文件。我计划将它们打包为docker镜像。我是否需要在每个镜像中捆绑Java运行时环境,还是可以依赖于运行镜像的主机已经有了Java运行时环境?

您需要在每个镜像中捆绑Java运行时环境,因为Docker容器是独立的,不受主机环境的影响。如果您没有在镜像中捆绑Java运行时环境,则可能会导致Java应用程序无法正常运行。

2个回答

9
您可以使用卷来将主机中的Java运行时挂载到容器中,但这会使容器不够便携(正如Andrew Fox所指出的那样)。
如果您使用像java:8-jre这样的通用基础映像为容器提供支持,则该映像将在容器之间共享,这意味着磁盘上只有一个副本(而非每个容器一个副本)。
请注意,在两种情况下,仍然会有多个JVM运行,即每个容器都会运行一个。

你能分享一些支持这个观点的东西吗?这种行为是特定于Java的吗?谢谢! - Betlista
2
只需查找一下 CoW 文件系统的工作原理即可。我重新措辞了我的答案,以便更清楚地表达我的意思。https://docs.docker.com/storage/storagedriver/ - Adrian Mouat
1
这是非常好的阅读,谢谢!简而言之,它不是针对Java特定的,任何人都可以轻松地实现相同的效果... CoW代表“写时复制”。 - Betlista

2

Docker的理念是使您的设置具有可移植性,因此如果您不安装Java运行时环境,则无法保证它在目标系统上能够正常工作。我认为除非有特殊的白名单设置,否则Docker无法访问主机可执行文件,但在我的经验中,它不能。


这取决于依赖项,即某个版本中是否存在JVM,就像您的镜像将在相同的主机操作系统或相同的Docker版本上运行一样... 这只是我的观点,没有冒犯之意... - Betlista

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接