需求:编写一个基于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
网友评论