记一次,Docker镜像1G多精简至300+M的过程

  • 一、业务场景描述
  • 二、Docker时区不一致,相差8小时
  • 三、通过Docker发布的服务上传文件上传不上去
  • 四、上传的图片带水印,水印中包含的字体显示不出来,显示为方框
  • 五、镜像太大,每个镜像都大概1G以上




一、业务场景描述

公司采用微服务的开发模式,通过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 stop $(docker ps -a -q) # 先需要停止所有容器 docker rm $(docker ps -a -q) docker rmi $(docker images - ...

  2. Docker镜像瘦身

    Docker 是一个用于开发,交付和运行应用程序的开发平台. 它能够将应用程序和基础架构分开,保证开发,测试, 部署的环境完全一致,从而达到快速交付的目的. 但是在实际项目中,会对项目中的模块或者服务 ...

  3. 精简压缩优化 Docker 镜像几百MB

    转载:http://www.dockerinfo.net/3328.html 介绍 前段时间网易蜂巢曾经推出蜂巢 Logo T恤,用的正是 Docker 镜像制作,最神奇的是,它最终的镜像大小只有 5 ...

  4. docker里mysql精简版_精简Docker镜像的几个方法

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

  5. docker镜像创建与优化

    1 . 创建镜像 有两种方法构建镜像: docker commit :将运行的容器保存成镜像 Dockerfile:自动构建 使用docker commit 创建镜像分为三步: 运行容器 修改容器 将 ...

  6. 【ORACLE】从安装ORACLE LINUX 8开始构建一个ORACLE21C的docker镜像

    前言 最近有不少ORACLE21C的特性想测试,但是它有些特性是基于ORACLE LINUX操作系统的,网上没搜到现成docker或者虚拟机镜像,而且oracle cloud免费的21c体验不对中国区 ...

  7. springboot项目打包为docker镜像并上传nexus私服

    springboot项目docker打包镜像上传Nexus私服 1.springboot项目打包为docker镜像并上传nexus私服 1.0. 必要条件 1.1.开启docker远程访问 1.2.配 ...

  8. Docker镜像优化

    Docker镜像优化 原文:Docker镜像优化 前言 上篇博文说到使用Visual Studio Tools for Docker帮助我们生成Dockerfile,现在我们讨论下生成的Dockerf ...

  9. 一键清理 Nexus 中无用的 Docker 镜像

    欢迎访问陈同学博客原文 现许多团队使用 Nexus 来管理 Docker 镜像,产品不断迭代,镜像仓库占用的磁盘空间也越来越大.由于 Nexus 的控制台并未提供批量操作镜像功能,清理镜像十分不便.本 ...

最新文章

  1. 技术 | Web前端开发(4)持续更新
  2. Mybatis优缺点
  3. 测试如何开始像用户那样思考(译)
  4. HPU-- 1190 確率
  5. 叮咚!您收到一份2021知位停车新品发布会暨合作伙伴大会邀请函
  6. SignalR第一节-在5分钟内完成通信连接和消息发送
  7. C语言程序main入口函数
  8. Linux安装MySQL-MariaDB版本
  9. java项目之人事管理系统|HRM(java毕业设计Struts2、mybatis框架项目
  10. 64位系统安装SQL2000SP4详细教程[已测试WIN72008R2]
  11. 蓝牙协议分析工具Wireshark/Frontline/Ellisys的使用
  12. 人文讲座之《阳明心学与今日中国》
  13. 服务器2008r2启动修复,Windows Server 2008 R2原生启动试用
  14. win10九月十五更新补丁导致共享打印机无法连接
  15. Android 获取彩信文本内容及 发送时间 发送人
  16. 什么蓝牙耳机性价比高?四款高品质蓝牙耳机测评
  17. 人脸图像的几何归一化和灰度归一化
  18. user()与current_user()
  19. 无线传感网笔记--物理层
  20. 《DNS与BIND(第5版)》——10.4 增量区域传输(IXFR)

热门文章

  1. ZF1与ZF2的对比
  2. 哈哈日语 | 超实用商务日语问题
  3. 计算机专业活动简报,计算机系团总支活动简报2011.11第一次
  4. 第3周作业 #高级编程技术
  5. 大学生课程设计 ------ 安卓Android软件设计(电话本)
  6. PyQt开发的手机同步软件(方便的电话本编辑和短信群发功能)
  7. 审计计算机小能手评选方案,浅析如何做好计算机审计
  8. CSS样式表继承和优先级
  9. ubuntu下字体位置
  10. Simlab Composer 10中文版