需求:編寫(xiě)一個(gè)基于alpine的jdk1.8環(huán)境
網(wǎng)上很多包括官方都是基于jre的,因?yàn)槲⒎?wù)其實(shí)只要服務(wù)跑起來(lái)即可虫啥。
但是由于我們公司新上微服務(wù),所以希望可以帶上jstat 等分析命令好后期幫助分析問(wèn)題,而jre里面是沒(méi)有這些命令的枢泰,所以需要jdk環(huán)境。
一铝噩、官方尋找
發(fā)現(xiàn)只有基于jdk14 alpine3.10的Dockerfile
https://github.com/docker-library/docs/blob/master/openjdk/README.md#supported-tags-and-respective-dockerfile-links
由于jdk版本太高了衡蚂,放棄,不過(guò)這個(gè)可以作為我自己編寫(xiě)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"]
這里讓我遇到了一個(gè)很大的坑骏庸,我看這個(gè)這么簡(jiǎn)單毛甲,那我改掉上面的jdk14換成我自己的jdk8不就行了嘛,結(jié)果試了很多次都是失敗告終具被。
查了很多資料:
- Java是基于GUN Standard C library(glibc)
- Alpine是基于MUSL libc(mini libc)
也就是alpine不能很好的支持jdk環(huán)境玻募,支持jre可以。
解決辦法: - 采用alpine-glbic鏡像 如frolvlad/alpine-glibc:alpine-3.9,不過(guò)好像不維護(hù)了一姿,當(dāng)然自己的jdk8需要好好的瘦身才行七咧。
- 采用alpine,然后利用阿里的repo源安裝jdk環(huán)境叮叹,這個(gè)時(shí)候應(yīng)該是裝上相關(guān)環(huán)境才能讓jdk執(zhí)行艾栋。這樣安裝發(fā)現(xiàn)鏡像也比較小。
二蛉顽、網(wǎng)上查找1
https://blog.csdn.net/qq_37054881/article/details/84580812
這篇文章也還算新蝗砾,19年2月寫(xiě)的
不過(guò)這里找到了一個(gè)重點(diǎn)說(shuō)jdk需要依賴glibc,暫且放著這點(diǎn)。
\# using alpine-glibc instead of alpine is mainly because JDK relies on glibc
FROM docker.io/jeanblanchard/alpine-glibc
他的方法是自己下載jre1.8然后刪掉不需要的文件
這個(gè)恰恰印證了上面的觀點(diǎn)悼粮,good闲勺!
三、網(wǎng)上查找2
https://qingmu.io/2018/08/07/How-to-run-springcloud-in-docker/
這篇文章雖然有點(diǎn)老扣猫,但寫(xiě)的很不錯(cuò)菜循,我可能需要參考這篇文章來(lái)持續(xù)集成。
四苞笨、通過(guò)官方docker知道了一些點(diǎn)
node:<version>
基于Debian,官方默認(rèn)鏡像债朵。當(dāng)你不確定你需要什么的時(shí)候選擇這個(gè)就對(duì)了。這個(gè)被設(shè)計(jì)成可以丟棄的鏡像瀑凝,也就是可以用作構(gòu)建源碼使用序芦。體積挺大。
node:<version>-slim
基于Debian粤咪, 刪除了很多默認(rèn)公共的軟件包谚中,只有node運(yùn)行的最小環(huán)境。除非你有空間限制寥枝,否則推薦使用默認(rèn)鏡像宪塔。
node:buster-slim其實(shí)就是debian10的瘦身版
node:<version>-alpine
基于alpine, 比Debian小的多。如果想要最小的鏡像囊拜,可以選擇這個(gè)做為base某筐。需要注意的是,alpine使用musl代替glibc冠跷。一些c環(huán)境的軟件可能不兼容南誊。但大部分沒(méi)問(wèn)題。
五蜜托、結(jié)論
如沒(méi)有非常必要都選用alpine然后在這之上去構(gòu)建自己的需求抄囚。
- 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