【docker基础学习之】镜像构建

下面是在工作过遇到的一些实际例子,谨以此作为笔记参考

目录

    • 1.背景
    • 2. 寻找方案
    • 3. 如何解决
    • 4.解决步骤
      • 4.1 DockerFile
      • 4.2 现在要做的
    • 5. 镜像相关命令

1.背景

  • 部署(迁移)项目时发现,项目的excel导出功能报错,错误如下:
    问题原因:我们这个项目依赖的镜像上的jdk缺少某种字体程序导致!
Caused by: java.lang.NullPointerException: nullat java.desktop/sun.awt.FontConfiguration.getVersion(Unknown Source)at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(Unknown Source)at java.desktop/sun.awt.FontConfiguration.init(Unknown Source)at java.desktop/sun.awt.X11FontManager.createFontConfiguration(Unknown Source)at java.desktop/sun.font.SunFontManager$2.run(Unknown Source)at java.base/java.security.AccessController.doPrivileged(Native Method)at java.desktop/sun.font.SunFontManager.<init>(Unknown Source)at java.desktop/sun.awt.FcFontManager.<init>(Unknown Source)at java.desktop/sun.awt.X11FontManager.<init>(Unknown Source)... 174 common frames omitted

或者含FontConfiguration的报错


java.lang.NullPointerException: nullat sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)at sun.awt.FontConfiguration.init(FontConfiguration.java:107)at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)at sun.font.SunFontManager$2.run(SunFontManager.java:431)at java.security.AccessController.doPrivileged(Native Method)at sun
  • 或者我们服务器上镜像的jdk版本是jdk8,而我们的项目需要jdk17
    如下图:使用docker images命令查看
    在这里插入图片描述

2. 寻找方案

我按照网上步骤一直给docker容器内部使用命令安装字体等操作,类似于如下命令:
yum install fontconfig
fc-cache --force

亦或是下面这个

以下为解决步骤:yum -y install fontconfig
在 /usr/share 下多出 fontconfig 和 fonts 目录。
yum -y install zstd
下载字体 ttf-dejavu: Package: mingw-w64-x86_64-ttf-dejavu - MSYS2 Packages
tar -I zstd -xvf mingw-w64-x86_64-ttf-dejavu-2.37-3-any.pkg.tar.zst
cp mingw64/share/fonts/TTF/* /usr/share/fonts/
fc-cache --force
fc-list
重启服务进程
PS:另外一种方案是将SXSSFWorkbook替换成HSSFWorkbook

但是始终没有解决我的问题(ps:以上命令不要轻易在生产服务器尝试

3. 如何解决

首先要搞清楚的一点就是:(仅针对本次案例)我们是使用的docker-compose.yml文件来进行服务配置的,(包括数据库、redis、mq等)。我们部署在docker服务器上的web程序启动需要jdk,就好比在本地idea启动需要西安配置好jdk环境一样,程序才可以启动起来。

以下是个人理解:(可以说服务器上存在了三种jdk)

  • docker服务器本身的jdk(可使用docker java -version 命令查看)
  • 容器在打包前依赖的jdk
  • 容器依赖镜像上配置的jdk

以上三种jdk的关系:

  • docker服务器本身的jdk:几乎用不到,甚至可以不要
  • 容器在打包前依赖的jdk:决定了你要这个程序在其他机器(服务器)启动时,也要依赖这个jdk
  • 容器依赖镜像上配置的jdk:就是我们程序启动时需要依赖的jdk(且这个jdk和docker服务器上本身的jdk没有任何关系)
    简而言之就是web服务器依赖的jdk是在dokcer镜像里面

讲清楚概念后,就好理解了,那么我们需要做的就是:

  • 1.要么重新生成一个镜像使得该镜像2有我们需要的字体程序;
  • 2.要么给我们的web程序之前依赖的镜像1上添加字体程序配置;

我在这选择了方法1,因为镜像1可能也被其他容器(服务)正在使用依赖,若我们擅自修改配置,可能造成其他服务短暂的崩溃或者宕机。

4.解决步骤

我们使用的是DockerFile 文件来进行镜像生成的,大概就长下面这样:
(可以自己去网上找关于DockerFile 文件里面的配置项都是什么意思?怎么写的)

FROM openjdk:8-jre-alpineENV PROJECT_HOME /home/project
ENV FILE_NAME placeholder
ENV EXPOSE_PORT 8080
ENV ACTIVE_ENV dev
ENV JAVA_OPTS ""RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*RUN set -x && \mkdir -p /root/logs/$FILE_NAME && \mkdir -p $PROJECT_HOMEWORKDIR $PROJECT_HOMEENTRYPOINT [ "/bin/sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar $PROJECT_HOME/$FILE_NAME.jar --spring.profiles.active=$ACTIVE_ENV" ]EXPOSE $EXPOSE_PORT

其中RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*就是我需要的字体程序配置。

4.1 DockerFile

docker镜像是利用DockerFile文件生成的;
关于DockerFile :

  • 使用dockerFile文件可生产我们程序需要的jdk版本;同时还可以在里面进行相应的字体程序的添加;也就是生成需要依赖的jdk和字体程序镜像;
  • Dockerfile是一个包含用于组合映像的命令的文本文档, Docker通过读取Dockerfile中的指令自动生成映像。
    在服务器上随便一个路径建一个文件:名称.Dockerfile,然后进去这个路径后,使用docker build 命令生成该镜像

4.2 现在要做的

  • 最好就在我们的web程序目录下建一个该文件,比如名字为:app.DockerFile;

  • 把我们配置好的代码片粘进去app.DockerFile文件;

  • 使用docker build -t java-app . -f app.Dockerfile 命令去生成该镜像

    • 其中java-app是你为这个镜像起的名字,不要和我们docker已有的镜像名重复即可
    • 不要忘记后面的.
    • 这个命令是已经在app.DockerFile文件所在目录下执行的,若是非该目录,需要在后面加上其路径(还可以为我们的镜像使用标签tag,这样就保证了镜像的唯一性,即时名字重复也可以找到可以自己去了解docker生成镜像的步骤
  • 然后我们只需要等待镜像安装下载完毕,然后使用docker images命令查看我们的镜像是否已在列表即可(比如我起名的镜像为 java-app-font):
    在这里插入图片描述

  • 最后在我们的docker-compose.yml文件里面修改我们当前web程序(容器)所依赖的镜像名称,然后重启一下我们的docker-compose.yml文件即可
    (也别忘记重启你的web服务)
    image: java-app-font
    在这里插入图片描述

  • 重启compose命令
    docker-compose --compatibility up -d

  • 移除compose配置命令
    docker-compose --compatibility down

5. 镜像相关命令

关于docker镜像使用,包括

  • 查看本宿主机镜像列表:docker images
  • 删除镜像:docker rmi 镜像名
  • 构建镜像:docker build
    具体的介绍可以移步阿里的菜鸟教程学习:Docker 镜像使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/519738.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营day09 | KMP算法理论理解、28. 实现 strStr()、459.重复的子字符串

写这两题之前&#xff0c;先了解一下什么是KMP算法 目录 KMP定义作用前缀表定义为什么一定要使用前缀表最长公共前后缀如何计算前缀表 next数组前缀表与next数组的关系使用next数组来匹配时间复杂度分析构造next数组使用next数组来做匹配 实现 strStr()思路解题方法复杂度暴力…

Unity 动画(旧版-新版)

旧版 旧版-动画组件&#xff1a;Animation 窗口-动画 动画文件后缀: .anim 将制作后的动画拖动到Animation组件上 旧版的操作 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c1 : MonoBehaviour {// Start is called before…

C++——string(2)

5. string类非成员函数 上面的几个接口大家了解一下&#xff0c;下面的OJ题目中会有一些体现他们的使用。string类中还有一些其他的 操作&#xff0c;这里不一一列举&#xff0c;大家在需要用到时不明白了查文档即可。 试用rfind、substr、find、find_first_(not)_of void te…

Docker将本地的镜像上传到私有仓库

使用register镜像创建私有仓库 [rootopenEuler-node1 ~]# docker run --restartalways -d -p 5000:5000 -v /opt/data/regostry:/var/lib/registry registry:2[rootopenEuler-node1 ~]# docker images REPOSITORY TAG IMAGE…

重装系统后正版office如何安装

前言 重装系统后&#xff0c;正版office如何安装 登录官网 https://www.microsoft.com 下载office https://account.microsoft.com/services

共用体union

一、共用体的特性 共用体又叫做联合体&#xff0c;共用体的特性如下&#xff1a; 1.共用体的所有成员共用一段内存空间&#xff0c;且所有成员的起始位置是一致的 2.共用体的值由最后赋值的成员决定 3.共用体的内存大小 共用体的内存必须大于或等于其他成员变量中最大数据类型…

分享几种简约大方的ListView外观设计(qml)

一、前言 最近才学到这里&#xff0c;感觉基础的 ListView 很丑&#xff0c;就现学现用弄个几个自认为还行的设计给大家献丑了。如果你觉得还不错&#xff0c;代码就在下面拿去直接用&#xff0c;顺便给我点个赞哈 ~ 感谢感谢 ~ 二、正文 设计1 第一种就是正常的左侧边栏&am…

电销平台架构的演变与升级

简介 信也科技电销平台承载了公司400多坐席的日常外呼任务&#xff0c;随着公司业务规模不断增长&#xff0c;业务复杂度不断提升&#xff0c;营销模式需要多样化&#xff0c;营销流程需要更加灵活。为了更好地赋能业务、提高客户转化率&#xff0c;电销平台不断升级优化&#…

OPC UA 学习笔记:状态机/有限状态机

有限状态机 有限状态机 &#xff08;FSM&#xff09; 是程序员、数学家、工程师和其他专业人士用来描述具有有限数量条件状态的系统的数学模型。 有限状态机的构成包括以下内容&#xff1a; 一组潜在的输入事件。与潜在输入事件相对应的一组可能的输出事件。系统可以显示的一…

19.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据分析工具数据类型配置功能的实现

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;18.数据分析工具数据与消息配置的实现 码云地址&#xff08;master 分支&#xff…

Centos9环境部署MySQL的PXC

前期理解 pxc就是将多个mysql数据库整合为一个集群&#xff0c;每台服务器上的mysql数据库会实时同步&#xff0c;而且节点与节点之间&#xff0c;他们相互的关系是对等的。PXC 最关注的是数据的一致性&#xff0c;对待事物的行为时&#xff0c;要么在所有节点上执行&#xff…

练习 5 Web [GXYCTF2019]BabyUpload

[GXYCTF2019]BabyUpload 猜测直接上传txt会被过滤&#xff0c;提示“上传类型也太露骨了吧&#xff01;”按经验传入一个"muma.phtml" 提示过滤了“ph”相关的后缀 传入muma.jpg等图像格式&#xff0c;提示表明复原并检测了文件内容 审查文件后缀Context-type 不能…