美文网首页docker
记录docker第一次选jdk镜像(1)

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

作者: 燃燃的爸爸 | 来源:发表于2019-10-11 17:30 被阅读0次

    需求:编写一个基于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:<version>
    

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

    node:<version>-slim
    

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

    node:<version>-alpine
    

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

    五、结论

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

    • jdk的Dockerfile
    FROM alpine:3.8
    MAINTAINER qingmu 247687009@qq.com
    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 247687009@qq.com
    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)

        本文链接:https://www.haomeiwen.com/subject/prftmctx.html