Я пытаюсь создать образ докера alpine с помощью openjdk 11. Для этого я запускаю контейнер alpine:
docker run -it alpine:3.9 /bin/sh
И запускаю следующее:
export JAVA_HOME=/opt/openjdk-11
export PATH=$JAVA_HOME/bin:$PATH
export JAVA_VERSION=11.0.2
export JAVA_URL=https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
export JAVA_SHA256=99be79935354f5c0df1ad293620ea36d13f48ec3ea870c838f20c504c9668b57
set -eux; \
\
wget -O /openjdk.tgz "$JAVA_URL"; \
echo "$JAVA_SHA256 */openjdk.tgz" | sha256sum -c -; \
mkdir -p "$JAVA_HOME"; \
tar --extract --file /openjdk.tgz --directory "$JAVA_HOME" --strip-components 1; \
rm /openjdk.tgz;
После этого я могу подтвердить, что некоторые вещи кажутся правильными:
/ # ls -lah $JAVA_HOME/bin/java
+ ls -lah /opt/openjdk-11/bin/java
-rwxr-xr-x 1 668 668 8.5K Jan 18 05:20 /opt/openjdk-11/bin/java
/ # echo $PATH
+ echo /opt/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/opt/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/ # which java
+ which java
/opt/openjdk-11/bin/java
Но когда я запускаю сам java
, я получаю:
/ # java -version
+ java -version
/bin/sh: java: not found
И меня выкидывают из контейнера. Я что-то упустил?
Причина, по которой вы получаете java: не найдено
, вероятно, из-за сбоя динамического связывания. Вы можете проверить это с помощью ldd java
.
Alpine Linux использует musl-libc для своей реализации libc (стандартная библиотека C), в отличие от большинства других Linux, использующих glibc , библиотека C GNU. Как следствие, стандартное программное обеспечение Linux, построенное на дистрибутивах, отличных от Alpine, обычно связано с glibc и не может быть запущено на Alpine без установки уровня совместимости с glibc. В частности, вам понадобится сборка OpenJDK 11 Alpine.
Однако, к сожалению, такая сборка в настоящее время недоступна. На странице OpenJDK 11 указано:
Сборка Alpine Linux, ранее доступная на этой странице, была удалена с версии JDK 11 GA. Он не готов к производству, потому что не был достаточно тщательно протестирован, чтобы считаться сборкой GA.
Альтернативы:
Установка надлежащего glibc в контейнер Alpine. Это довольно простая процедура, которая позволит вам запускать любое программное обеспечение Linux на Alpine. Однако вы больше не будете запускать «родной Alpine». Для процедуры установки см. Это сообщение .
Установка неофициального OpenJDK 11 Alpine от поставщика OpenJDK. В частности, Zulu OpenJDK - очень хорошая альтернатива, предлагающая тщательно протестированные и проверенные сборки, которые также являются бесплатными и с открытым исходным кодом.
Дополнительная информация доступна в этом сообщении StackOverflow:
Почему базовый образ Docker Java 11 так большой? (openjdk: 11-jre-slim)
Обновление:
По состоянию на 06.02.19 пакет openjdk11
доступен в репозиториях Alpine! Его можно взять из репозитория edge / community
с помощью:
apk --no-cache add openjdk11 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community