一、业务场景描述

公司采用微服务的开发模式,通过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镜像压缩完成。

记一次,Docker镜像1G多精简至300+M的过程的更多相关文章

  1. 记一次docker镜像导出导入流程

    目标:导出测试环境的镜像到本地机器 过程: 测试机: docker save -o /Dockerfile/crontabService/php72.tar lnmp72:v1.4 压缩,要不文件太大 ...

  2. 精简你的 docker 镜像

    精简你的 docker 镜像 Intro 现在 docker 的使用越来越普遍,今天来谈一下如何精简你的 docker 镜像 为什么要精简 docker 首先来说说为什么要精简 docker 镜像,减 ...

  3. 制作基于Buildbot的自动化测试系统Docker镜像

    Buildbot in Docker 前言 最近使用Buildbot做了一个自动测试的框架,为了部署方便,可以把测试框架做成Docker镜像,方便部署.这里记录下过程,供大家参考. 项目介绍 项目是一 ...

  4. 精简Docker镜像的五种通用方法

    http://dockone.io/article/8163 精简Docker镜像的好处很多,不仅可以节省存储空间和带宽,还能减少安全隐患.优化镜像大小的手段多种多样,因服务所使用的基础开发语言不同而 ...

  5. 精简Docker镜像的几个方法

    一.使用更精简的镜像 常用的Linux系统镜像一般有 Debian.Ubuntu.CentOS和Alpine,其中Alpine是面向安全的轻量级Linux发行版本.Docker的Alpine镜像仅有不 ...

  6. Docker 镜像制作教程:针对不同语言的精简策略

    本系列文章将分为三个部分: 第一部分着重介绍多阶段构建(multi-stage builds),因为这是镜像精简之路至关重要的一环.在这部分内容中,我会解释静态链接和动态链接的区别,它们对镜像带来的影 ...

  7. Docker 镜像针对不同语言的精简策略

    导航: 这里分为几个部分. 相关转载云原生:米开朗基杨 1.Docker减小镜像体积 2.Docker镜像针对不同语言的精简策略 对于刚接触容器的人来说,他们很容易被自己制作的 Docker 镜像体积 ...

  8. Docker镜像与容器命令(转)

    Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare metal. ...

  9. Docker镜像细节

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面: 为什么需要Docker? Docker入 ...

随机推荐

  1. jsp文件导包

    可以在一个页面中用上多个<% @ page %>指令,但是其中的属性只能用一次,不过也有个例外,那就是import属性.因为import属性和Java中的import语句差不多(参照Jav ...

  2. 批量修改vsphere共享存储多路径选择策略

    传统方式修改存储的多路径选择策略 首先说一下传统web界面操作方式: 可以看到至少需要6次才能修改完成一个.在生产环境中一般会挂载很多FC存储,这时候就需要一个批量快捷的方式来修改. 使用Powerc ...

  3. jQuery报错:Uncaught ReferenceError: $ is not defined解决方法

    原因及解决办法 1:加载jquery失败,就再次确认jquery的路径是否正确. 2:如果jquery的路径没有问题,那么就可能是浏览器在解释你的js语句时,还没有加载jquery库.所以,你需要将加 ...

  4. 用漫画的形式展现——URL和HTTP

    http请求内容:请求头:get.post等发送请求(其他:head.put.delete.option) host 地址 user-Agent cookie 通行证 head:与get请求类似,不同 ...

  5. 一文搞懂Java引用拷贝、深拷贝、浅拷贝

    刷题.面试中,我们可能会遇到将一个对象的属性赋值到另一个对象的情况,这种情况就叫做拷贝.拷贝与Java内存结构息息相关,搞懂Java深浅拷贝是很必要的! 在对象的拷贝中,很多初学者可能搞不清到底是拷贝 ...

  6. linux based bottlerocket-os

    linux based bottlerocket-os 概要 aws开源,专注与运行容器的linux os 参看 https://github.com/bottlerocket-os

  7. 十、scala、spark集群搭建

    spark集群搭建: 1.上传scala-2.10.6.tgz到master 2.解压scala-2.10.6.tgz 3.配置环境变量 export SCALA_HOME=/mnt/scala-2. ...

  8. CS系统中分页控件的制作

    需求:在一个已有的CS项目(ERP中),给所有的列表加上分页功能. 分页的几个概念: 总记录数  totalCount (只有知道了总记录数,才知道有多少页) 每页记录数  pageSize (根据总 ...

  9. 数仓建设中最常用模型--Kimball维度建模详解

    数仓建模首推书籍<数据仓库工具箱:维度建模权威指南>,本篇文章参考此书而作.文章首发公众号:五分钟学大数据,公众号中发送"维度建模"即可获取此书籍第三版电子书 先来介绍 ...

  10. 自定义注解,更优雅的使用MP分页功能

    分页功能使用 MP的分页功能是通过MyBatis的插件实现的,使用起来也非常简单.下面先介绍下使用方式. step1:配置分页插件 @Configuration @EnableTransactionM ...