构建最小JDK Docker镜像=>改换成文章:重构基础docker镜像

一、问题描述

最近在使用docker部署spring Cloud微服务项目的时候发现,每个服务构建出的镜像文件高达700M。
镜像较大的镜像往往会导致移植,迁移缓慢。最后启动并进入容器发现,jdk用的是openjdk,那么我们就需要在构建镜像时使用更小的jdk作为基础镜像,进而减小镜像的大小.

二、解决方案

使用Oracle的JRE而不是openjdk,并构建成Docker镜像。

2.1 下载并上传jre到linux服务器

jre8下载地址:https://www.java.com/en/download/manual.jsp

jre linux x64

大小大概是80M

2.2 删除无用文件

解压压缩包

$ tar -zxv -f jre-8u181-linux-x64.tar.gz

删除无用的文件

$ cd jre1.8.0_181/
$ rm -rf COPYRIGHT LICENSE README release THIRDPARTYLICENSEREADME-JAVAFX.txt THIRDPARTYLICENSEREADME.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
重新打包
$ tar zcvf jre1.8.0_231.tar.gz *

2.3 新建Dockerfile

vim Dockerfile_jre1.8.0_231

# using alpine-glibc instead of alpine  is mainly because JDK relies on glibc
FROM docker.io/jeanblanchard/alpine-glibc:latest
# author
MAINTAINER sandu <1103324414@qq.com>
# date zone 设置时间,避免相差8个小时
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
# A streamlined jre
ADD jre1.8.0_231.tar.gz /usr/local/java/jdk/
# set env
ENV JAVA_HOME /usr/local/java/jdk/
ENV PATH ${PATH}:${JAVA_HOME}/bin
# run container with base path:/opt
WORKDIR /opt

2.4 构建docker镜像

docker build -t 192.168.75.12/library/jre:1.8 -f Dockerfile_jre1.8.0_231 .

这样构建的jdk镜像大概是130M左右。

2.5 测试

# docker run -it 192.168.75.12/library/jre:1.8
/opt # java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
/opt # date
Tue Oct 29 10:22:33 UTC 2019

2.6 推送到Harbor仓库

[root@bogon jre1.8.0_231]# docker login http://192.168.75.12
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

[root@bogon jre1.8.0_231]# docker push 192.168.75.12/library/jre:1.8
The push refers to repository [192.168.75.12/library/jre]
0c64e8821df0: Pushed 
cc24d9491ad4: Pushed 
fd414845c3cc: Pushed 
6dbecb8e1a3e: Layer already exists 
77cae8ab23bf: Layer already exists 
1.8: digest: sha256:3484a7852d1330867c14805c03db28ccde2cc327e2ceb5658aaeb0bea010122a size: 1365

20200618下载的最新版本是1.8.251
不过构建docker镜像的时候需要做些调整,不然容器内时间会差8个小时

/usr/local/src/jre1.8.0_251 # cp /etc/localtime . 
/usr/local/src/jre1.8.0_251 # touch  timezone 
/usr/local/src/jre1.8.0_251 # echo "Asia/Shanghai" >> timezone  

/usr/local/src/jre1.8.0_251 # ll                                                                                                   
总用量 43M
drwxr-xr-x  2 10143 10143  208 6月  18 10:53 bin
-rw-r--r--  1 root  root   268 6月  18 11:36 Dockerfile_jre1.8.0_251
-rw-r--r--  1 root  root   43M 6月  18 10:54 jre1.8.0_251.tar.gz
drwxr-xr-x 13 10143 10143 4.0K 6月  18 10:53 lib
-rw-r--r--  1 root  root   556 6月  18 11:41 localtime
drwxr-xr-x  4 10143 10143   47 3月  12 14:33 man
-rw-r--r--  1 root  root    14 6月  18 11:44 timezone

/usr/local/src/jre1.8.0_251 # cat Dockerfile_jre1.8.0_251                                                                          
FROM docker.io/jeanblanchard/alpine-glibc:latest
MAINTAINER sandu <1103324414@qq.com>
COPY localtime /etc/localtime
COPY timezone /etc/timezone
ADD jre1.8.0_251.tar.gz /usr/local/java/jdk/
ENV JAVA_HOME /usr/local/java/jdk/
ENV PATH ${PATH}:${JAVA_HOME}/bin
/usr/local/src/jre1.8.0_251 # docker build -t idocker.io/jre:1.8.251 -f Dockerfile_jre1.8.0_251 .                                   
Sending build context to Docker daemon  161.1MB
Step 1/7 : FROM docker.io/jeanblanchard/alpine-glibc:latest
 ---> b18af330677b
Step 2/7 : MAINTAINER sandu <1103324414@qq.com>
 ---> Using cache
 ---> 032d2550e70a
Step 3/7 : COPY localtime /etc/localtime
 ---> 11bfcd12b1cd
Step 4/7 : COPY timezone /etc/timezone
 ---> f04d04a9a714
Step 5/7 : ADD jre1.8.0_251.tar.gz /usr/local/java/jdk/
 ---> 0bcb7f049c6d
Step 6/7 : ENV JAVA_HOME /usr/local/java/jdk/
 ---> Running in e986b48fb724
Removing intermediate container e986b48fb724
 ---> 193adeb5015b
Step 7/7 : ENV PATH ${PATH}:${JAVA_HOME}/bin
 ---> Running in 4b7fda4a59ad
Removing intermediate container 4b7fda4a59ad
 ---> bbba3f4d1958
Successfully built bbba3f4d1958
Successfully tagged idocker.io/jre:1.8.251
/usr/local/src/jre1.8.0_251 # docker images                                                                                         
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
idocker.io/jre               1.8.251             bbba3f4d1958        5 seconds ago       133MB
redis                        latest              235592615444        7 days ago          104MB
jeanblanchard/alpine-glibc   latest              b18af330677b        2 weeks ago         17.3MB
/usr/local/src/jre1.8.0_251 # docker run -it idocker.io/jre:1.8.251                                                             
/ # date
Thu Jun 18 11:49:32 CST 2020
/ # java -version
java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)
/ # exit
原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/11760747.html