O Java 11 é anunciado como a versão mais recente do LTS. Então, estamos tentando iniciar novos serviços com base nesta versão Java.
No entanto, a imagem base do Docker para Java 11 é muito maior que o equivalente ao Java 8:
openjdk:8-jre-alpine
: 84 MBopenjdk:11-jre-slim
: 283 MB
(Estou considerando apenas o OpenJDK oficial e as imagens mais leves para cada versão do Java.)
Uma escavação mais profunda descobriu as seguintes "coisas":
a
openjdk:11-jre-slim
imagem usa a imagem basedebian:sid-slim
. Isso traz 2 questões:isso é 60 MB maior que
alpine:3.8
as versões do Debian
sid
são instáveis
o
openjdk-11-jre-headless
pacote instalado na imagem é 3 vezes maior queopenjdk8-jre
(dentro do contêiner do Docker em execução):openjdk:8-jre-alpine
:/ # du -hs /usr/lib/jvm/java-1.8-openjdk/jre/lib/ 57.5M /usr/lib/jvm/java-1.8-openjdk/jre/lib/
openjdk:11-jre-slim
:# du -sh /usr/lib/jvm/java-11-openjdk-amd64/lib/ 179M /usr/lib/jvm/java-11-openjdk-amd64/lib/
Aprofundando, descobri a "raiz" desse peso - é o
modules
arquivo do JDK:# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
Então, agora as perguntas que vieram:
Por que
alpine
não é mais usado como imagem base para imagens slim do Java 11?Por que a versão sid instável é usada para imagens Java LTS?
Por que o pacote slim / headless / JRE para o OpenJDK 11 é tão grande em comparação com o pacote OpenJDK 8 semelhante?
- O que é esse arquivo de módulos que traz 135 MB no OpenJDK 11?
UPD : como solução para esses desafios, pode-se usar esta resposta: Aplicativo Java 11 como imagem do docker
Respostas:
Isso porque, infelizmente, não existe atualmente nenhuma compilação oficial estável do OpenJDK 11 para a Alpine.
O Alpine usa o musl libc, em oposição ao glibc padrão usado pela maioria dos Linuxs, o que significa que uma JVM deve ser compatível com o musl libc para suportar o baunilha Alpine. A porta principal do OpenJDK está sendo desenvolvida no projeto Portola do OpenJDK .
O status atual é resumido na página do OpenJDK 11 :
As únicas versões estáveis do OpenJDK para o Alpine atualmente são 7 e 8, fornecidas pelo projeto IcedTea .
No entanto - se você quiser considerar outro que não seja o OpenJDK oficial, o Zulu OpenJDK da Azul oferece uma alternativa atraente:
Para disponibilidade e roteiro de suporte , consulte Roteiro de suporte da Azul .
Atualização, 06/03/19: A partir de ontem,
openjdk11
está disponível nos repositórios Alpine! Pode ser acessado no Alpine usando:O pacote é baseado na
jdk11u
ramificação do OpenJDK, além de correções portadas do projeto Portola, introduzido com o seguinte PR . Muitos elogios e muito obrigado à equipe Alpine.Essa é uma pergunta / solicitação justa. Na verdade, existe um ticket aberto para o fornecimento do Java 11 em uma versão estável do Debian:
https://github.com/docker-library/openjdk/issues/237
Atualização, 26/12/18: o problema foi resolvido e agora a imagem slim do OpenJDK 11 é baseada no
stretch-backports
OpenJDK 11, que foi disponibilizado recentemente ( link para PR ).O Java 9 introduziu o sistema de módulos, que é uma abordagem nova e aprimorada para agrupar pacotes e recursos, em comparação aos arquivos jar. Este artigo da Oracle fornece uma introdução muito detalhada a esse recurso:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
O
modules
arquivo agrupa todos os módulos fornecidos com o JRE. A lista completa de módulos pode ser impressa comjava --list-modules
.modules
é realmente um arquivo muito grande e, como comentado, contém todos os módulos padrão e, portanto, é bastante inchado.Uma coisa a ser observada, no entanto, é que ela substitui
rt.jar
etools.jar
ficou obsoleta, entre outras coisas, portanto, ao considerar o tamanho demodules
quando comparado com compilações anteriores ao OpenJDK, os tamanhos dert.jar
etools.jar
devem ser subtraídos (eles devem ocupar 80 MB combinados) .fonte
como em 07.2019, https://adoptopenjdk.net/ possui suporte oficial da Alpine para Java 11:
https://github.com/AdoptOpenJDK/openjdk-docker/blob/master/11/jdk/alpine/
https://hub.docker.com/r/adoptopenjdk/openjdk11
No entanto, os módulos ( jmods ,
jlink
) ainda devem ser considerados quando se monta a aplicação mínima.Nota : as imagens slim não contêm alguns módulos (como
java.sql
) - elas são excluídas explicitamente ( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233 )fonte
https://hub.docker.com/_/openjdk?tab=tags&page=1&name=11.0.7-jre-slim
no repositório docker openjdk, a imagem do slim jre 11 é inferior a 70mb
fonte