使用Dockerfile打包java项目生成镜像部署到Linux

1、Dockerfile 介绍

如果说容器就是“小板房”,镜像就是“样板间”。那么,要造出这个“样板间”,就必然要有一个“施工图纸”,由它来规定如何建造地基、铺设水电、开窗搭门等动作。这个“施工图纸”就是“Dockerfile”。

比起容器、镜像来说,Dockerfile 非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像、拷贝文件、运行脚本等等,每个指令都会生成一个 Layer,而 Docker 顺序执行这个文件里的所有步骤,最后就会创建出一个新的镜像出来。

2、编写java项目对应的Dockerfile

# 使用 OpenJDK 8 作为基础镜像
FROM openjdk:8-jdk-alpine# 作者信息
LABEL maintainer="flgb"# 设置环境变量
ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \JAVA_OPTS="-Xms2048m -Xmx2048m -Dspring.profiles.active=prod -Dserver.port=6088"\PORT=6088
# spring-boot-admin.jar相对于Dockerfile的路径
COPY /spring-boot-admin.jar /spring-admin.jar# sh shell -c 执行后面命令
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /spring-admin.jar"]#通过 EXPOSE 命令暴露外部访问容器端口
EXPOSE $PORT

注意点

ADD 和COPY 的区别

COPY 和 ADD 都是用于将文件从主机复制到 Docker 容器内部的命令,但它们之间有一些区别:

  1. COPY 命令只能复制本地主机上的文件或目录到容器内部,不能从 URL 或者其他网络资源复制文件。而 ADD 命令可以从本地主机、URL
    或者其他网络资源复制文件。
  2. ADD 命令支持自动解压缩 tar 类型的文件(如压缩文件
    .tar、.tar.gz、.tar.bz2、.tar.xz),并将解压后的内容复制到容器内。而 COPY
    命令则只是简单地复制文件,不会自动解压缩。
  3. 由于 ADD 命令的功能更多,因此在复制文件时,建议优先使用 COPY 命令,除非需要 ADD 的特殊功能。

CMD 和 ENTRYPOINT的区别

CMD 指令

  • CMD 用于指定容器启动时要执行的命令。
  • 可以有多个 CMD 指令,但只有最后一个生效。
  • 如果 Dockerfile 中没有 CMD 指令,则默认会执行容器启动时所用的镜像的 CMD 命令。
  • CMD 指令可以被 Docker run 命令中的参数覆盖。

ENTRYPOINT 指令

  • ENTRYPOINT 用于指定容器启动时要执行的可执行文件或脚本。
    只需要运行该镜像,就会自动执行 ENTRYPOINT 指定的命令

  • 如果 Dockerfile 中存在多个 ENTRYPOINT 指令,则只有最后一个生效。

  • 在运行容器时,可以通过在 docker run 命令中指定参数来覆盖 ENTRYPOINT 中的内容。

  • 如果 Dockerfile 中同时存在 ENTRYPOINT 和 CMD 指令,则 CMD 的内容会被作为参数传递给 ENTRYPOINT
    所指定的可执行文件或脚本。

3、构建java项目镜像

docker build [OPTIONS] PATH | URL | -

其中,PATH 可以是本地文件系统上 Dockerfile 文件所在的路径,也可以是 URL,或者是 -(表示使用标准输入)。OPTIONS 是一些可选参数,常用的参数包括:

  • -t, --tag:为镜像设置一个标签,格式为 :。例如,-t myimage:1.0。
  • -f, --file:指定要使用的 Dockerfile 文件的路径。如果不指定,默认为当前目录下的 Dockerfile 文件。
  • 其他选项包括 --build-arg、–pull、–no-cache 等,可以根据需要进行设置。

例如,如果 Dockerfile 文件位于当前目录下,可以使用以下命令构建镜像并设置标签:

docker build -t spring-boot:1.0 .

上传dockerfile和spring-boot-admin jar到对应路径/data/java/spring-boot下

在这里插入图片描述

构建镜像

docker build -t spring-boot:1.0 

Build的路径问题

经常会遇到如下报错:
COPY failed: stat xxxx: no such file or directory

1、Dockerfile 文件查找不到
如果dockerfile不在当前目录,则需要指定dockerfile 目录构建

docker build -f "/data/java/spring-boot/Dockerfile" -t spring-boot:1.0 

2、Copy /spring-boot-admin.jar文件找不到的问题

COPY 命令中指定的源路径应该是相对于 Dockerfile 的路径

  • 如果 spring-boot-admin.jar 文件位于与 Dockerfile 同级的目录下,应该将 COPY 命令修改为:
COPY spring-boot-admin.jar /spring-admin.jar
  • 如果 spring-boot-admin.jar 文件位于 Dockerfile 的上级目录中,可以使用 … 来指定父级目录
COPY ../spring-boot-admin.jar /spring-admin.jar
  • PS:一开始把COPY 的路径设置成了/data/java/spring-boot/spring-boot-admin.jar一直找不到,报错:
failed to walk /var/lib/docker/tmp/buildkit-mount2576932656/data/java/spring-boot: lstat /var/lib/docker/tmp/buildkit-mount2576932656/data/java/spring-boot: no such file or directory

查看已经构建成功的镜像

docker images

4、生成容器

  • 执行命令
docker run -p 6088:6088 --name springboot --restart always \
> -d spring-boot:1.0

查看项目启动日志,启动成功

docker log 容器id
#动态更细查看日志
docker log -f 容器id

在这里插入图片描述

5、docker 应用日志映射到本地

进入容器里面查看日志

#查看对应容器id
docker ps 
#进入容器
docker exec -it container_id bash
#如果没装对应的bash命令,使用sh进入
docker exec -it container_id sh
#查看目录
ls
#退出容器
exit

#进入logback配置的输出log地址,查看日志文件在这里插入图片描述

#停止容器
docker stop id
#删除容器
docker rm id
#重新生成挂在日志到本地目录的容器
docker run -p 6088:6088 --name spring-boot --restart always \
-v /home/spring-boot/logs:/home/spring-boot/logs \
-d spring-boot:1.0

同步查看本地目录
在这里插入图片描述

6、docker环境下 easyExcel导出错误

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.font.SunFontManager.<init>(SunFontManager.java:376)at sun.awt.FcFontManager.<init>(FcFontManager.java:35)at sun.awt.X11FontManager.<init>(X11FontManager.java:57)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at java.lang.Class.newInstance(Class.java:442)at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)at java.security.AccessController.doPrivileged(Native Method)at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)at java.awt.Font.getFont2D(Font.java:491)at java.awt.Font.canDisplayUpTo(Font.java:2060)at java.awt.font.TextLayout.singleFont(TextLayout.java:470)at java.awt.font.TextLayout.<init>(TextLayout.java:531)at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:273)at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117)at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:82)at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:684)at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:705)

因为docker的基础镜像openjdk缺少字体。

at sun.awt.FcFontManager.(FcFontManager.java:35)
org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:705)

解决方式

1.Dockerfile 中进行修改,增加如下内容
ENV LANG en_US.UTF-8
RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*2.更换jdk镜像源
FROM frolvlad/alpine-java:jdk8-slim

7、保存Docker 镜像,部署到其他机器

  • 在源机器上导出 Docker 镜像:
docker save -o <保存路径>/<镜像文件名>.tar <镜像名称>:<标签>docker save -o /tmp/myimage.tar myimage:latest
  • 将镜像文件复制到目标机器。你可以使用 scp、rsync 或其他文件传输工具将文件复制到目标机器。

  • 在目标机器上导入 Docker 镜像:

docker load -i <镜像文件路径>/<镜像文件名>.tardocker load -i /tmp/myimage.tar

查看目标机器上加载了镜像

docker images 

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

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

相关文章

VUE3.0(一):vue3.0简介

Vue 3 入门指南 什么是vue Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界…

0基础 三个月掌握C语言(13)-下

数据在内存中的存储 浮点数在内存中的存储 常见的浮点数&#xff1a;3.141592、1E10等 浮点数家族包括&#xff1a;float、double、long double类型 浮点数表示的范围&#xff1a;在float.h中定义 练习 关于&#xff08;float*)&n&#xff1a; &n&#xff1a;这是一…

2549.统计桌面上的不同数字:数学O(1) / 模拟O(n^3)

【LetMeFly】2549.统计桌面上的不同数字&#xff1a;数学O(1) / 模拟O(n^3) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-distinct-numbers-on-board/ 给你一个正整数 n &#xff0c;开始时&#xff0c;它放在桌面上。在 109 天内&#xff0c;每天都要执行下…

Java transient 关键字

Java字段不想序列化怎么办 在 Java 中&#xff0c;如果某个字段不想被序列化&#xff08;即不希望被写入到序列化的数据流中&#xff09;&#xff0c;可以使用 transient 关键字进行标记。通过在字段前加上 transient 关键字&#xff0c;可以告诉 Java 序列化机制忽略该字段&am…

53、Qt/信号与槽、QSS界面设计20240322

一、使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是…

Stable Diffusion训练图片时,简陋的数据处理

0 图片从命名 如果有强迫症&#xff0c;看到似乎乱码的命名会不舒服&#xff0c;那么就批量从命名 import osdef rename_files_in_directory(directory, key_word, new_suffix):i 1for filename in os.listdir(directory):new_file key_word str(i).zfill(3) new_suffixsou…

yolov6实现遥感影像目标识别|以DIOR数据集为例

1 目标检测是计算机视觉领域中的一项重要任务&#xff0c;它的目标是在图像或视频中检测出物体的位置和类别。YOLO&#xff08;You Only Look Once&#xff09;是一系列经典的目标检测算法&#xff0c;最初由Joseph Redmon等人于2016年提出。YOLO算法具有快速、简单、端到端的特…

证书(公钥):网络安全的关键

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

YOLOv5全网首发改进: 注意力机制改进 | 上下文锚点注意力(CAA) | CVPR2024 PKINet 遥感图像目标检测

💡💡💡本文独家改进:引入了CAA模块来捕捉长距离的上下文信息,利用全局平均池化和1D条形卷积来增强中心区域的特征,从而提升检测精度,CAA和C3进行结合实现二次创新,改进思路来自CVPR2024 PKINet,2024年前沿最新改进,抢先使用 💡💡💡小目标数据集,涨点近两个…

【亚马逊云AI课程上新】「生成式 AI 精英速成计划」 即刻成为炙手可热 AI 人才

文章目录 1. 生成式 AI 精英速成计划介绍2. 重磅课程 增亮你的职业生涯3. 多种身份 全面赋能4. 关于「商业应用技能」课程5. 关于「技术开发技能」课程介绍6. 化身学霸得好礼 好礼双周送附&#xff1a;亚马逊云科技海外账号注册流程 1. 生成式 AI 精英速成计划介绍 &#x1f4…

解决大型语言模型中的幻觉问题:前沿技术的综述

大型语言模型中的幻觉问题及其解决技术综述 摘要 大型语言模型(LLM)如GPT-4、PaLM和Llama在自然语言生成能力方面取得了显著进步。然而&#xff0c;它们倾向于产生看似连贯但实际上不正确或与输入上下文脱节的幻觉内容&#xff0c;这限制了它们的可靠性和安全部署。随着LLM在…

公司调研 | Agility | 网红人形机器人Digit | 商业化情况

最近做的一些公司 / 产品调研没有从技术角度出发&#xff0c;而更关注宏观发展&#xff1a;主营方向、产品介绍、商业化落地情况、融资历程、公司愿景、创始人背景等。部分调研放在知乎上&#xff0c;大部分在飞书私人链接上 最近较关注人形Robot的发展情况&#xff0c;欢迎感兴…

在云上部署我的个人博客!!!

这和上一篇是连起来的&#xff0c;大家先整体看一遍&#xff0c;不要跟&#xff0c;前面有些弯路&#xff01;&#xff01;&#xff01; 【这是按时计费的&#xff0c;欠费不能用&#xff0c;交了好几次哈哈哈哈 】 【我买的域名是&#xff1a;128.1.61.228】 【把域名这个位置…

C#面:什么是不可变字符串

C# 中的字符串类型&#xff08;string&#xff09;是不可变的&#xff0c;这意味着一旦创建了一个字符串对象&#xff0c;就不能再对其进行修改。 当对一个字符串进行拼接、替换、删除等操作时&#xff0c;实际上是创建了一个新的字符串对象&#xff0c;而原始的字符串对象保持…

鸿蒙Harmony应用开发—ArkTS(@Link装饰器:父子双向同步)

子组件中被Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。 说明&#xff1a; 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 概述 Link装饰的变量与其父组件中的数据源共享相同的值。 限制条件 Link装饰器不能在Entry装饰的自定义组件中使用…

优化选址问题 | 模拟退火算法求解物流选址问题含Matlab源码

目录 问题代码问题 模拟退火算法(Simulated Annealing, SA)是一种概率性的全局优化算法,用于求解大规模组合优化问题。在物流选址问题中,模拟退火算法可以用来寻找成本最低、效率最高的仓库或配送中心位置。下面是一个简化的模拟退火算法求解物流选址问题的描述,并附带有…

贪吃蛇(C语言超详细版)

目录 前言&#xff1a; 总览&#xff1a; API&#xff1a; 控制台程序&#xff08;Console&#xff09;&#xff1a; 设置坐标&#xff1a; COORD&#xff1a; GetStdHandle&#xff1a; STD_OUTPUT_HANDLE参数&#xff1a; SetConsoleCursorPosition&#xff1a; …

LabVIEW飞行器螺旋桨性能测试与数据监控

LabVIEW飞行器螺旋桨性能测试与数据监控 开发LabVIEW的电动飞行器螺旋桨性能测试与数据监控系统&#xff0c;专门针对电动飞行器螺旋桨在运行过程中的性能测试和监控需求。通过采集转速、转矩、拉力和温度等关键参数&#xff0c;系统能够实时监测和分析螺旋桨的状态&#xff0…

33-Java服务定位器模式 (Service Locator Pattern)

Java服务定位器模式 实现范例 服务定位器模式&#xff08;Service Locator Pattern&#xff09;用于想使用 JNDI 查询定位各种服务的时候考虑到为某个服务查找 JNDI 的代价很高&#xff0c;服务定位器模式充分利用了缓存技术在首次请求某个服务时&#xff0c;服务定位器在 JNDI…

Mysql---备份恢复

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.Mysql日志类型 错误日志&#xff1a; 错误日志主要记录如下几种日志&#xff1a; 服务器启动和关闭过程中的信息 服务器运行过程中的错误信息 事件调度器运行一个时间是产生的信息 在从服…