Я пытаюсь создать образ докера 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: not found
вероятно, из-за сбоя динамического связывания. Вы можете проверить это, используя 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