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

这篇具有很好参考价值的文章主要介绍了【docker基础学习之】镜像构建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1.背景

  • 部署(迁移)项目时发现,项目的excel导出功能报错,错误如下:
    问题原因:我们这个项目依赖的镜像上的jdk缺少某种字体程序导致!
Caused by: java.lang.NullPointerException: null
	at 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: null
  at 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命令查看
    【docker基础学习之】镜像构建,docker服务器相关,docker,java-ee,spring boot,spring cloud,mysql,kafka,postgresql

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-alpine

ENV 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_HOME

WORKDIR $PROJECT_HOME

ENTRYPOINT [ "/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基础学习之】镜像构建,docker服务器相关,docker,java-ee,spring boot,spring cloud,mysql,kafka,postgresql

  • 最后在我们的docker-compose.yml文件里面修改我们当前web程序(容器)所依赖的镜像名称,然后重启一下我们的docker-compose.yml文件即可
    (也别忘记重启你的web服务)
    image: java-app-font
    【docker基础学习之】镜像构建,docker服务器相关,docker,java-ee,spring boot,spring cloud,mysql,kafka,postgresql

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

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

5. 镜像相关命令

关于docker镜像使用,包括文章来源地址https://www.toymoban.com/news/detail-840264.html

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

到了这里,关于【docker基础学习之】镜像构建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot集成Docker并将镜像推送linux服务器

    案例使用springboot项目,在IDEA 中集成Docker生成镜像,并将镜像发布到linux服务器 具体步骤如下: 更新系统的软件包列表 安装Docker所需的软件包和依赖项: 完成安装后,启动Docker服务。在终端中运行以下命令: 验证Docker是否成功安装。在终端中运行以下命令: linux查看docke

    2024年02月09日
    浏览(34)
  • 服务器离线部署docker,镜像迁移,mysql主从搭建等服务

    公司项目要上线项目,买了两台云服务器,需进行环境部署(1台接入公网,一台只能局域网访问),主要部署以下内容 1、服务器之间配置ssh免密 2、离线docker部署 3、docker镜像迁移 4、redis服务 5、minio文件服务 6、kkFileView文件预览服务 7、mysql主从搭建 目录 1、配置两台服务器

    2024年02月04日
    浏览(44)
  • Linux +Docker镜像打包导出,上传至内网服务器

      sudo:以管理员权限运行命令,通常用于在 Linux 系统中运行需要管理员权限的命令。 docker:Docker 命令行工具。 commit:提交 Docker 镜像的命令。 -a:指定镜像的作者,这里是作者的名字: yjw。 e007d8b7e1b7:docker的容器id。 my_projectv2:v2:要新创建的镜像的名称和版本号,这里是

    2024年02月02日
    浏览(57)
  • docker容器打包成镜像,在新的服务器上部署环境

    2719a6b5b8e1是容器id(用docker ps 命令查看) , my_paddle2.2.2:v1 是自己打包的镜像的名字命名格式,有冒号的 docker commit -a “shi” -m “to150” 2799a6b6b8e1 my_paddle2.2.2:v1 -o 和 是一个意思都是打包镜像的符号 sparkdemo:v1 ,就是有冒号,整体镜像名字规则 docker images查看镜像,后用命令保存

    2023年04月08日
    浏览(57)
  • 将本地Python项目打包成docker镜像,上传到服务器,在docker中运行

    windows11 Docker下载地址:https://docs.docker.com/desktop/install/windows-install/ 虚拟环境可以搭建独立的Python运行环境,使得单个项目的运行环境与其他项目互不影响。 安装完成之后,便可以直接创建虚拟环境了,使用命令 virtualenv env1 进行创建 其中 activate.bat 文件,表示激活虚拟环境。

    2024年02月11日
    浏览(54)
  • Docker 在内网服务器通过配置代理访问外网拉取镜像

    该文章引用自:http://roc.havemail.cn/archives/1640.html 感谢作者,我放到这里给自己留个备份。 作者原文介绍了《详解 Docker 的三种网络代理配置》,按理说,在服务器上 直接配置 http_proxy 和 https_proxy 代理 ,所有的服务就都能访问外网了。 但是实际操作过程中,发现配置了这两个

    2024年02月15日
    浏览(43)
  • [Docker实现测试部署CI/CD----相关服务器的安装配置(1)]

    CI,Continuous Integration,持续集成。即将持续不断更新的代码经构建、测试后也持续不断的集成到项目主干分支。 CD,包含两层含义:Continuous Delivery,持续交付,和 Continuous Deployment,持续 部署。 持续交付:是持续集成的后续步骤,持续频繁地将软件的新版本交付到类生产环境

    2024年02月14日
    浏览(51)
  • [Docker实现测试部署CI/CD----相关服务器的安装配置(2)]

            Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。 下载Linux版本的jdk,解压到/usr/local目录 进入 /etc/profile 目录,设置环境变量 刷新配置文件,输入

    2024年02月14日
    浏览(56)
  • [Docker实现测试部署CI/CD----Jenkins集成相关服务器(3)]

             SonarScanner 是一种代码扫描工具,专门用来扫描和分析项目代码质量。扫描和分析完 成之后,会将结果写入到 SonarQube 服务器的数据库中,并在 SonarQube 平台显示这些数 据。         在 SonarQube 官网的帮助文档中可以下载 SonarScanner。这里下载一个 Linux 系统下使

    2024年02月14日
    浏览(43)
  • arm和x86架构服务器拉取arm64架构的docker镜像

    dockerhub提供的镜像部分支持arm64架构 Docker arm架构服务器拉取docker镜像,默认是arm架构  查看docker镜像的架构 x86平台拉取arm平台的docker镜像 对docker版本有限制 docker运行其他平台容器,需要使用--platform参数指定容器 docker19.03.9及以上版本才支持--platform参数 查看是否开启experi

    2024年01月20日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包