为什么Java需要基本映像才能在docker

时间:2019-05-10 18:55:06

标签: linux docker

我试图了解为什么没有基本的OS映像就无法在docker容器中运行Java。
我尝试了下一个基本的dockerfile:

FROM scratch

ADD openjdk-11.0.2_linux-x64_bin.tar.gz /java

CMD ["/java/jdk-11.0.2/bin/java", "-version" ]

并出现以下错误:

standard_init_linux.go:207: exec user process caused "no such file or directory"

据我了解,这可能与未满足的依赖关系有关,但是我仍然不明白为什么我只需要运行基本映像附带的所有用户空间文件系统来运行二进制可执行文件。他们不应该在本地运行吗?能够独立运行的二进制文件和不能独立运行的二进制文件有什么区别?

此外,我想知道该文件standard_init_linux.go是什么? linux内核包含go代码吗?

我已经找到了一些有关基本图像的资源(如下),但是它们仍然不能为我的问题提供直接答案。

资源

3 个答案:

答案 0 :(得分:1)

共享库

未静态链接的可执行文件需要它们链接的链接器,加载器和共享库(例如标准C库)。这是由您的操作系统映像提供的。

答案 1 :(得分:1)

二进制文件具有共享库依赖关系。如果这些依赖项不在系统中,它将无法运行。

正如您所说,很难直接检查映像,但是您可以查看主机系统上的可执行文件。这是我的样子:

muttrc

安装muttrcmutt-secrets使其运行:

import re
import sys

print("Marathon Time Calculator")
str_pace = input("At what pace do you run a km? (e.g. 5:30): ")

# this is looking for a decimal value of 1 number, then a colon then another decimal value of 1 - 2 numbers
pattern = '\d{1}\:\d{1,2}' 

# this is doing the actual check against the pattern for us
match = re.match(pattern, str_pace)

# we now check if there is a match to our pattern
if not match:
    print('Invalid Time Input Try Again')
    sys.exit
else:
    # yes we are entering the value correctly continue the code
    split_pace = str_pace.split(":")

    minutes = int(split_pace[0])
    seconds = int(split_pace[1])

    str_pace = minutes * 60 + seconds
    totalTime = str_pace * 42

    hours = totalTime // 3600
    timeLeft = totalTime % 3600

    minutes = timeLeft // 60
    seconds = timeLeft % 60

    print("You should complete a marathon in {}:{}:{}".format(hours, minutes, seconds))

答案 2 :(得分:-2)

Java / JVM实际上只是另一个可执行程序,例如“ apache”或“ top”。像所有程序一样,它需要操作系统主机来管理硬件并提供标准化接口。 Java的二进制代码针对特定的OS和内核进行编译。

从根本上来说,我很好奇Docker容器是否可以在没有基本OS映像的情况下运行。容器应使用主机内核,但仍应在内核顶部需要基础OS映像。