一、业务场景描述

公司采用微服务的开发模式,通过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. Spring事务管理?

    事务管理方式: 1.编码方案,不建议使用,具有侵入性,在原有的业务代码基础上去添加事物管理代码 2.声明式事务控制,基于AOP对目标进行代理,不具有侵入性,不需要修改原来的业务代码

  2. JavaDailyReports10_17

    学习JavaWeb第一天 输出我的第一个HelloWorld! 1 <%@ page language="java" import="java.util.*&quo ...

  3. Command1

    命令 [-参数][操作对象] ls -la /etc -l 以长格式显示详细信息 -a 显示目录下全部文件(包括隐藏文件) ls 执行权限:所有用户 功能:显示目录下的文件 ls -ald -d 查看 ...

  4. Facetoobject_encapsulation

    面向对象程序设计思想 一.思想 处处皆对象. 当提到某一功能时,首先应该想有没有实现该功能的对象,有则调用,没有则创建类.当提到数据时,应该想到属于哪个对象. 1.求1~n的累加和 public cl ...

  5. LeetCode145 二叉树的后序遍历

    给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? /** * Defin ...

  6. Flutter 应用入门:包管理

    pubspec.yaml name: flutter_combat description: A Flutter combat application. # The following defines ...

  7. 剑指offer 面试题3:数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  8. python学习笔记 | PyCharm创建文件时自动添加头文件

    File Settings Editor File and Code Templates Python Script 然后在右边的框中写入信息就可以啦: # -*- coding: utf-8 -*- ...

  9. Burp suite的系列介绍 (1)

    前言 为了进行Web安全方面的学习,Burp suite是必备的工具之一,我们将会从多个模块进行逐步的学习. Burp suite的应用场景 1.HTTP服务端接口测试. 2.HTTP客户端和HTTP ...

  10. 【Docker】/usr/bin/docker-current: Cannot connect to the Docker daemon at unix

    ------------------------------------------------------------------------------------------------- | ...