Docker容器之最小JDK基础镜像
https://my.oschina.net/shyloveliyi/blog/1627020一、说明1、使用的是Oracle的JRE不是openjdk。alpine小道消息据说docker要换成这个作为基础镜像2、因为java依赖glibc,所以基础镜像使用的是alpine-glibc而非alpine,alpine-glibc大概是11.1M。二、制作...
https://my.oschina.net/shyloveliyi/blog/1627020
一、说明
1、使用的是Oracle的JRE不是openjdk。alpine小道消息据说docker要换成这个作为基础镜像
2、因为java依赖glibc,所以基础镜像使用的是alpine-glibc而非alpine,alpine-glibc大概是11.1M。
二、制作
1、首先下载jre,下载地址是https://www.java.com/en/download/manual.jsp,大概是77M。
2、解压jre包,删除根目录下文本文件,然后删除其他不必要文件。
#解压
tar xvcf jre-8u161-linux-x64.tar.gz
#进入目录
cd jre1.8.0_161/
#删除文本文件
rm -rf COPYRIGHT LICENSE README release THIRDPARTYLICENSEREADME-JAVAFX.txtTHIRDPARTYLICENSEREADME.txt Welcome.html
#删除其他无用文件
rm -rf lib/plugin.jar \
lib/ext/jfxrt.jar \
bin/javaws \
lib/javaws.jar \
lib/desktop \
plugin \
lib/deploy* \
lib/*javafx* \
lib/*jfx* \
lib/amd64/libdecora_sse.so \
lib/amd64/libprism_*.so \
lib/amd64/libfxplugins.so \
lib/amd64/libglass.so \
lib/amd64/libgstreamer-lite.so \
lib/amd64/libjavafx*.so \
lib/amd64/libjfx*.so
3、重新打包所有文件(不打包也可以,在Dockerfile里ADD这个目录即可,当前精简完jre目录大小是107M,压缩后是41M)
tar zcvf jre8.tar.gz *
4、创建Dockerfile
# using alpine-glibc instead of alpine is mainly because JDK relies on glibc
FROM docker.io/jeanblanchard/alpine-glibc
# author
MAINTAINER scc <shangchengcai@voole.com>
# A streamlined jre
ADD jre8.tar.gz /usr/java/jdk/
# set env
ENV JAVA_HOME /usr/java/jdk
ENV PATH ${PATH}:${JAVA_HOME}/bin
# run container with base path:/opt
WORKDIR /opt
5、构建(整体大小是122M)
docker build -t voole/java8:1.0 .
6、测试运行
# docker run -it voole/java8:1.0
/opt # java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
时区问题
适用对象
- 使用 Alpine Linux 发行版的 Docker 镜像容器。
- 仅仅适用于没有安装
uclibc
的系统。
修改步骤
-
进入容器命令行
# docker exec -it container_name /bin/sh
-
安装 timezone 数据包
# apk add -U tzdata # ls /usr/share/zoneinfo
为了防止添加失败,加上
-U
参数,更新仓储缓存。
列出安装的时区文件,验证是否下载成功。 -
拷贝需要的时区文件到
localtime
,国内需要的是Asia/Shanghai
:# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-
验证时区
# date Tue Jan 9 22:53:46 CST 2018
CST
即为中国标准时间
。 -
移除时区文件:
# apk del tzdata
为了保证容器的精简和轻量,移除下载的时区文件。通过测试,jdk 中或正常获取设置的东8时区。但还有一个遗留问题,使用 springboot 启动项目,打印出来的时间时间还是默认时区,而应用中获取的时间都是正常的时间。暂且记下,有时间再细看解决办法:在dockfile。冷静之后分析应该是JVM的时区不对。JVM是通过/etc/timezone文件获取时区的,需要在容器中映射或者写入时区文件。在Dockfile中新增命令:
-
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-
RUN echo "Asia/Shanghai" > /etc/timezone
https://blog.csdn.net/jiangjun0130/article/details/86505156
完整的dockfile:
FROM docker.io/jeanblanchard/alpine-glibc:latest
MAINTAINER wu_bo3@hoperun.com
ADD jre1.8.0_201.tar.gz /usr/java/jdk/
ADD Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENV JAVA_HOME /usr/java/jdk
ENV PATH ${PATH}:${JAVA_HOME}/bin
更多推荐
所有评论(0)