记录docker第一次选jdk镜像(1)

需求:编写一个基于alpine的jdk1.8环境

网上很多包括官方都是基于jre的,因为微服务其实只要服务跑起来即可。
但是由于我们公司新上微服务,所以希望可以带上jstat 等分析命令好后期帮助分析问题,而jre里面是没有这些命令的,所以需要jdk环境。

一、官方寻找

发现只有基于jdk14 alpine3.10的Dockerfile
https://github.com/docker-library/docs/blob/master/openjdk/README.md#supported-tags-and-respective-dockerfile-links
由于jdk版本太高了,放弃,不过这个可以作为我自己编写jdk1.8的参考
其他都是基于Debian的

FROM alpine:3.10

ENV JAVA_HOME /opt/openjdk-14
ENV PATH $JAVA_HOME/bin:$PATH

# https://jdk.java.net/
ENV JAVA_VERSION 14-ea+15
ENV JAVA_URL https://download.java.net/java/early_access/alpine/15/binaries/openjdk-14-ea+15_linux-x64-musl_bin.tar.gz
ENV JAVA_SHA256 76091da1b6ed29788f0cf85454d23900a4134286e5feb571247e5861f618d3cd
# "For Alpine Linux, builds are produced on a reduced schedule and may not be in sync with the other platforms."

RUN 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; \
    \
# https://github.com/docker-library/openjdk/issues/212#issuecomment-420979840
# https://openjdk.java.net/jeps/341
    java -Xshare:dump; \
    \
# basic smoke test
    java --version; \
    javac --version

# https://docs.oracle.com/javase/10/tools/jshell.htm
# https://docs.oracle.com/javase/10/jshell/
# https://en.wikipedia.org/wiki/JShell
CMD ["jshell"]

这里让我遇到了一个很大的坑,我看这个这么简单,那我改掉上面的jdk14换成我自己的jdk8不就行了嘛,结果试了很多次都是失败告终。
查了很多资料:

  • Java是基于GUN Standard C library(glibc)
  • Alpine是基于MUSL libc(mini libc)
    也就是alpine不能很好的支持jdk环境,支持jre可以。
    解决办法:
  • 采用alpine-glbic镜像 如frolvlad/alpine-glibc:alpine-3.9,不过好像不维护了,当然自己的jdk8需要好好的瘦身才行。
  • 采用alpine,然后利用阿里的repo源安装jdk环境,这个时候应该是装上相关环境才能让jdk执行。这样安装发现镜像也比较小。

二、网上查找1

https://blog.csdn.net/qq_37054881/article/details/84580812
这篇文章也还算新,19年2月写的
不过这里找到了一个重点说jdk需要依赖glibc,暂且放着这点。

\# using alpine-glibc instead of alpine  is mainly because JDK relies on glibc
FROM docker.io/jeanblanchard/alpine-glibc

他的方法是自己下载jre1.8然后删掉不需要的文件
这个恰恰印证了上面的观点,good!

三、网上查找2

https://qingmu.io/2018/08/07/How-to-run-springcloud-in-docker/
这篇文章虽然有点老,但写的很不错,我可能需要参考这篇文章来持续集成。

四、通过官方docker知道了一些点

node:

基于Debian,官方默认镜像。当你不确定你需要什么的时候选择这个就对了。这个被设计成可以丢弃的镜像,也就是可以用作构建源码使用。体积挺大。

node:-slim

基于Debian, 删除了很多默认公共的软件包,只有node运行的最小环境。除非你有空间限制,否则推荐使用默认镜像。
node:buster-slim其实就是debian10的瘦身版

node:-alpine

基于alpine, 比Debian小的多。如果想要最小的镜像,可以选择这个做为base。需要注意的是,alpine使用musl代替glibc。一些c环境的软件可能不兼容。但大部分没问题。

五、结论

如没有非常必要都选用alpine然后在这之上去构建自己的需求。

  • jdk的Dockerfile
FROM alpine:3.8
MAINTAINER qingmu [email protected]
ENV LANG=C.UTF-8 \
    JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk/jre \
    PATH=$PATH:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin \
    TZ=Asia/Shanghai
RUN echo "" > /etc/apk/repositories \
&& echo "https://mirrors.aliyun.com/alpine/v3.8/main/" >> /etc/apk/repositories \
&& echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories \
&& apk update && apk add --no-cache openjdk8 ca-certificates tzdata ttf-dejavu tini \
&& rm -rf /var/cache/apk/* \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
  • jre的Dockerfile
FROM alpine:3.8
MAINTAINER qingmu [email protected]
ENV LANG=C.UTF-8 \
    JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk/jre \
    PATH=$PATH:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin \
    TZ=Asia/Shanghai
RUN echo "" > /etc/apk/repositories \
&& echo "https://mirrors.aliyun.com/alpine/v3.8/main/" >> /etc/apk/repositories \
&& echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories \
&& apk update && apk add --no-cache openjdk8-jre ca-certificates tzdata ttf-dejavu tini \
&& rm -rf /var/cache/apk/* \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

你可能感兴趣的:(记录docker第一次选jdk镜像(1))