Почему Java требует базового образа для запуска в докере - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь понять, почему я не могу запустить Java внутри Docker-контейнера без базового образа ОС.
Я попробовал следующий основной 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 ]

1 голос
/ 10 мая 2019

Общие библиотеки .

Для исполняемых файлов, которые не являются статически связанными, требуется компоновщик, загрузчик и разделяемые библиотеки (например, стандартная библиотека C), с которыми они связываются. Это обеспечивается вашим образом ОС.

1 голос
/ 10 мая 2019

Двоичный файл имеет зависимости общей библиотеки. Если этих зависимостей нет в системе, они не запустятся.

Как вы сказали, трудно напрямую проверить образ, но вы можете взглянуть на исполняемый файл в вашей хост-системе. Вот как это выглядит на моем:

$ 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)

Mounting /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)
0 голосов
/ 10 мая 2019

Java / JVM - это просто другая исполняемая программа, такая как «apache» или «top».Как и всем программам, для управления оборудованием и обеспечения стандартизированных интерфейсов необходим хост операционной системы.Двоичный код Java скомпилирован с конкретными ОС и ядрами.

В более фундаментальном плане мне интересно, будет ли контейнер Docker работать без образа базовой ОС.Контейнер должен использовать ядро ​​хоста, но для него все еще требуется базовый образ ОС поверх ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...