记一次,Docker镜像1G多精简至300+M的过程
记一次,Docker镜像1G多精简至300+M的过程
- 一、业务场景描述
- 二、Docker时区不一致,相差8小时
- 三、通过Docker发布的服务上传文件上传不上去
- 四、上传的图片带水印,水印中包含的字体显示不出来,显示为方框
- 五、镜像太大,每个镜像都大概1G以上
一、业务场景描述
公司采用微服务的开发模式,通过Jenkins可持续集成,通过Docker发布服务,开发框架主要为Sping Boot。
之前发布的所有服务,出现过几个问题:
- 时区不一致,总是相差8小时。
- 通过Docker发布的服务上传文件上传不上去。
- 上传的图片带水印,水印中包含的字体显示不出来,显示为方框。
- 镜像太大,每个镜像都大概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的过程相关推荐
- [轻笔记]删除所有docker镜像与容器
docker stop $(docker ps -a -q) # 先需要停止所有容器 docker rm $(docker ps -a -q) docker rmi $(docker images - ...
- Docker镜像瘦身
Docker 是一个用于开发,交付和运行应用程序的开发平台. 它能够将应用程序和基础架构分开,保证开发,测试, 部署的环境完全一致,从而达到快速交付的目的. 但是在实际项目中,会对项目中的模块或者服务 ...
- 精简压缩优化 Docker 镜像几百MB
转载:http://www.dockerinfo.net/3328.html 介绍 前段时间网易蜂巢曾经推出蜂巢 Logo T恤,用的正是 Docker 镜像制作,最神奇的是,它最终的镜像大小只有 5 ...
- docker里mysql精简版_精简Docker镜像的几个方法
使用更精简的镜像 常用的Linux系统镜像一般有 Debian.Ubuntu.CentOS和Alpine,其中Alpine是面向安全的轻量级Linux发行版本.Docker的Alpine镜像仅有不到5 ...
- docker镜像创建与优化
1 . 创建镜像 有两种方法构建镜像: docker commit :将运行的容器保存成镜像 Dockerfile:自动构建 使用docker commit 创建镜像分为三步: 运行容器 修改容器 将 ...
- 【ORACLE】从安装ORACLE LINUX 8开始构建一个ORACLE21C的docker镜像
前言 最近有不少ORACLE21C的特性想测试,但是它有些特性是基于ORACLE LINUX操作系统的,网上没搜到现成docker或者虚拟机镜像,而且oracle cloud免费的21c体验不对中国区 ...
- springboot项目打包为docker镜像并上传nexus私服
springboot项目docker打包镜像上传Nexus私服 1.springboot项目打包为docker镜像并上传nexus私服 1.0. 必要条件 1.1.开启docker远程访问 1.2.配 ...
- Docker镜像优化
Docker镜像优化 原文:Docker镜像优化 前言 上篇博文说到使用Visual Studio Tools for Docker帮助我们生成Dockerfile,现在我们讨论下生成的Dockerf ...
- 一键清理 Nexus 中无用的 Docker 镜像
欢迎访问陈同学博客原文 现许多团队使用 Nexus 来管理 Docker 镜像,产品不断迭代,镜像仓库占用的磁盘空间也越来越大.由于 Nexus 的控制台并未提供批量操作镜像功能,清理镜像十分不便.本 ...
最新文章
- 技术 | Web前端开发(4)持续更新
- Mybatis优缺点
- 测试如何开始像用户那样思考(译)
- HPU-- 1190 確率
- 叮咚!您收到一份2021知位停车新品发布会暨合作伙伴大会邀请函
- SignalR第一节-在5分钟内完成通信连接和消息发送
- C语言程序main入口函数
- Linux安装MySQL-MariaDB版本
- java项目之人事管理系统|HRM(java毕业设计Struts2、mybatis框架项目
- 64位系统安装SQL2000SP4详细教程[已测试WIN72008R2]
- 蓝牙协议分析工具Wireshark/Frontline/Ellisys的使用
- 人文讲座之《阳明心学与今日中国》
- 服务器2008r2启动修复,Windows Server 2008 R2原生启动试用
- win10九月十五更新补丁导致共享打印机无法连接
- Android 获取彩信文本内容及 发送时间 发送人
- 什么蓝牙耳机性价比高?四款高品质蓝牙耳机测评
- 人脸图像的几何归一化和灰度归一化
- user()与current_user()
- 无线传感网笔记--物理层
- 《DNS与BIND(第5版)》——10.4 增量区域传输(IXFR)