zoukankan      html  css  js  c++  java
  • 记一次,Docker镜像1G多精简至300+M的过程





    一、业务场景描述

    公司采用微服务的开发模式,通过Jenkins可持续集成,通过Docker发布服务,开发框架主要为Sping Boot。

    之前发布的所有服务,出现过几个问题:

    1. 时区不一致,总是相差8小时。
    2. 通过Docker发布的服务上传文件上传不上去。
    3. 上传的图片带水印,水印中包含的字体显示不出来,显示为方框。
    4. 镜像太大,每个镜像都大概1G以上。

    针对如上问题,研究了几天Docker,全部解决,具体解决方案如下。

    二、Docker时区不一致,相差8小时

    在之前的Dockerfile中,一直采用的是

    FROM majava:8
    EXPOSE 8003
    RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
    ADD xx.jar xx.jar
    ENTRYPOINT ["java","-jar","-Xms256m","-Xmx512m","xx.jar"]
    

    之前使用完整版的Jdk时,这样启动没有问题,但是后来我将FROM 后的jdk,改为了精简jdk,然后会报错

    cp can't stat "/usr/share/zoneinfo/Asia/Shanghai"
    

    经过排查及调试后,更改命令:

    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
    

    问题解决。

    三、通过Docker发布的服务上传文件上传不上去

    因为项目时通过Jenkins可持续集成发布的,之前的附件一直找不到路径,docker run的时候,映射一下路径即可。

    docker run -e "--spring.profiles.active=dev" -d  -v /uploadfile/ui-dz:/uploadfile/ui-dz --net=host -v /logs/logs:/opt/logs gly/ui-dz:0.0.1
    

    四、上传的图片带水印,水印中包含的字体显示不出来,显示为方框

    问题原因:JRE 中缺少相应的字体。

    第一次解决方案是,将未精简的jdk1.8启动一个容器,进入容器中,将字体放入…/jre/lib/fonts/下面,然后通过docker commint的方式,重新生成一个镜像,这样做的后果会是,使原先庞大的Jdk,变得更加庞大,所以抛弃这种方式,重新思考。

    第二次解决方案,下载了精简版的JRE,解压后,直接将字体放入进Jre/lib/fonts/下面,然后通过Dockerfile的方式构建一个镜像。
    可以将JRE压缩成tar包,也可以直接ADD文件夹进去。

    FROM docker.io/jeanblanchard/alpine-glibc
    ADD jre1.8 /opt/
    ENV JAVA_HOME /opt/
    ENV PATH ${PATH}:${JAVA_HOME}/bin
    WORKDIR /opt
    

    这个地方遇见一个坑,如果压缩为Tar包,ADD进去后,会自动解压tar包,然后多一层目录,导致JAVA_HOME路径会配置错误。可能会出现如下错误:

    /bin/sh: {java,-jar,/app.jar}: not found
    

    五、镜像太大,每个镜像都大概1G以上

    下载精简版的JRE以后,删除掉相关无用文件,然后通过Dockerfile的方式构建一个镜像。
    注:Dockerfile中的FROM 的镜像也必须极小,采用了精简版的环境alpine-glibc。

    FROM docker.io/jeanblanchard/alpine-glibc
    ADD jre1.8 /opt/
    ENV JAVA_HOME /opt/
    ENV PATH ${PATH}:${JAVA_HOME}/bin
    #指定工作路径
    WORKDIR /opt
    

    然后构建镜像:

    **切记最后有一个点(.)

    docker build -t jdks:8 .
    

    然后其他服务即可通过FROM jdks:8构建镜像,这样构建出来的镜像,相较于之前的1G多,优化到了300M左右。

    之后,我想通过原先的命令进入容器中,

    docker exec -it imageId /bin/bash
    

    发现进不去,报错:

    docker exec提示错误oci runtime error: exec failed: container_linux.go
    

    百度一通,找到解决方案:

    sudo docker exec -it imageId /bin/sh
    

    至此,Docker镜像压缩完成。

  • 相关阅读:
    AtomQQ 随笔
    android下服务器推送实现 androidpn分析
    Pyqt Model/view框架 5.排序与过滤
    微软官方windows phone开发视频教程第二天视频(附下载地址)
    微软官方windows phone开发视频教程第一天视频(附下载地址)
    微软官方windows phone开发视频教程第三/四天视频(附下载地址)
    初见Ajax——javascript访问DOM的三种访问方式
    一个经历,实习?兼职?
    SQL分割字符串详解
    asp.net服务器控件button先执行js再执行后台的方法
  • 原文地址:https://www.cnblogs.com/aixing/p/13327239.html
Copyright © 2011-2022 走看看