一、业务场景描述

公司采用微服务的开发模式,通过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. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 写入和查询)--学习笔记

    2.5.3 MongoDB -- 写入和查询 写入 查询 查找操作符 逻辑操作符 其他 嵌套对象 数组 游标方法 写入 https://docs.mongodb.com/manual/tutorial ...

  2. TCP三次握手(通俗易懂)

    一--导读 前不久中国和外国RPEC协议的签订,标志着东亚自贸区的建立成功.现在韩国和日本要做贸易.日本一直监听着韩国总统的一举一动,但他又不会主动.(服务器的监听状态)只是被动的等着韩国总统先开口. ...

  3. C++ 简单输出当前日期时间

    根据https://www.runoob.com/cplusplus/cpp-date-time.html编写. 首先介绍2个数据类型. 一个是time_t,与时间函数相关的变量,定义的变量记录着自 ...

  4. DTCC 2020 | 阿里云李飞飞:云原生分布式数据库与数据仓库系统点亮数据上云之路

    简介: 数据库将面临怎样的变革?云原生数据库与数据仓库有哪些独特优势?在日前的 DTCC 2020大会上,阿里巴巴集团副总裁.阿里云数据库产品事业部总裁.ACM杰出科学家李飞飞就<云原生分布式数 ...

  5. Python——绘制埃菲尔铁塔

    from turtle import * import turtle colormode(255) #设置turtle颜色模式 speed(0) #速度 setup(800,800,720,0) #画 ...

  6. docker 镜像导入load、导出save以及重命名

    docker 导入导出操作 save 保存(导出)镜像 # 把镜像打包成 .tar # -o 要保存路径.tar # > 要保存路径.tar # docker save 镜像id > /存 ...

  7. 【Oracle】静默安装oracle 11.2.0.4 超详细

    安装oracle 1.执行脚本完成初始化oracle环境 2.解压缩oracle的压缩包,单实例1个,rac是2两个压缩包 3.修改response下的db_install.rsp 修改内容如下: - ...

  8. CTF实验吧-WEB题目解题笔记(1)简单的登陆题

    1.简单的登陆题 解题链接: http://ctf5.shiyanbar.com/web/jiandan/index.php  Burp抓包解密 乱码,更换思路.尝试id intruder 似乎也没什 ...

  9. css全站变灰

    2020年4月4日全国哀悼日这一天,我发现不少网址都变灰了,我第一想法就是怎么做到的?不可能换素材整个网址重做一遍吧?后面发现是用的其实是css的filter滤镜: grayscale可以将图像转化为 ...

  10. 翻译 - ASP.NET Core 基本知识 - 中间件(Middleware)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-5.0 中间件是集成 ...