为什么java需要基础镜像才能在docker上运行

mat*_*per 3 linux docker

我试图理解为什么我不能在没有基本操作系统映像的情况下在 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" ]
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

standard_init_linux.go:207: exec user process caused "no such file or directory"
Run Code Online (Sandbox Code Playgroud)

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

另外我有兴趣知道那个文件是什么standard_init_linux.go?Linux内核包含go代码吗?

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

资源

Joh*_*ica 5

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

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

$ ldd java/jdk-11.0.2/bin/java
    linux-vdso.so.1 (0x00007ffc16fac000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fd839c97000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd839a78000)
    libjli.so => /home/jkugelman/from-scratch-java/java/jdk-11.0.2/bin/../lib/jli/libjli.so (0x00007fd839867000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd839663000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd839272000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fd839eb4000)
Run Code Online (Sandbox Code Playgroud)

安装/lib/lib64运行:

$ docker run --rm -it -v /lib:/lib -v /lib64:/lib64 from-scratch-java
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
Run Code Online (Sandbox Code Playgroud)