使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的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 容器内部的命令,但它们之间有一些区别:
- COPY 命令只能复制本地主机上的文件或目录到容器内部,不能从 URL 或者其他网络资源复制文件。而 ADD 命令可以从本地主机、URL
或者其他网络资源复制文件。 - ADD 命令支持自动解压缩 tar 类型的文件(如压缩文件
.tar、.tar.gz、.tar.bz2、.tar.xz),并将解压后的内容复制到容器内。而 COPY
命令则只是简单地复制文件,不会自动解压缩。 - 由于 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缺少字体。
相关文章:

使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的dockerfile
比起容器、镜像来说,Dockerfile 非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像、拷贝文件、运行脚本等等,每个指令都会生成一个 Layer,而 Docker 顺序执行这个文件里的所有步骤&…...

爬虫案例九js逆向爬取CBA中国篮球网
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、CBA网站分析二、代码 前言 提示:这里可以添加本文要记录的大概内容: 爬取CBA中国篮球网 提示:以下是本篇文章正文内容…...

【DeepSeek】Ubuntu快速部署DeepSeek(Ollama方式)
文章目录 人人都该学习的DeepSeekDeepSeek不同版本功能差异DeepSeek与硬件直接的关系DeepSeek系统兼容性部署方式选择部署步骤(Ollama方式)1.选定适合的deepseek版本2.环境准备3.安装Ollama4.部署deepseek5.测试使用 人人都该学习的DeepSeek DeepSeek 作…...

C++后端服务器开发技术栈有哪些?有哪些资源或开源库拿来用?
一、 C后台服务器开发是一个涉及多方面技术选择的复杂领域,特别是在高性能、高并发的场景下。以下是C后台服务器开发的一种常见技术路线,涵盖了从基础到高级的技术栈。 1. 基础技术栈 C标准库 C11/C14/C17/C20:使用现代C特性,如…...

基于SpringBoot的餐厅点餐管理系统设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

服务端和客户端通信(TCP)
服务端 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;namespace TeachTcpServer {class Program{static void Main(string[] args){#region 知识点一 …...

Java 大视界 -- Java 大数据在智能体育赛事运动员表现分析与训练优化中的应用(122)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

基于Spring Boot的多级缓存架构实现
基于Spring Boot的多级缓存架构实现 以下是一个基于Spring Boot的多级缓存架构实现示例 多级缓存架构实现方案 1. 依赖配置(pom.xml) <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…...

Git与GitHub:理解两者差异及其关系
目录 Git与GitHub:理解两者差异及其关系Git:分布式版本控制系统概述主要特点 GitHub:基于Web的托管服务概述主要特点 Git和GitHub如何互补关系现代开发工作流 结论 Git与GitHub:理解两者差异及其关系 Git:分布式版本控…...

ALG(Alloy+Loki+Grafana)轻量级日志系统
ALG(AlloyLokiGrafana)轻量级日志系统 前提要求 GrafanaMinioNginxPrometheus Grafana日志收集系统旧版是PLG(ProtailLokiGrafana), Protail收集日志, Loki存储, Grafana展示, 后续的Protail不维护了, Grafana推出了Alloy代替Pritial, 除了收集日志外, 还集成管理Prometheus各种…...
【漫话机器学习系列】121.偏导数(Partial Derivative)
偏导数(Partial Derivative)详解 1. 引言 在数学分析、机器学习、物理学和工程学中,我们经常会遇到多个变量的函数。这些函数的输出不仅取决于一个变量,而是由多个变量共同决定的。那么,当其中某一个变量发生变化时&…...

Deepseek可以通过多种方式帮助CAD加速工作
自动化操作:通过Deepseek的AI能力,可以编写脚本来自动化重复性任务。例如,使用Python脚本调用Deepseek API,在CAD中实现自动化操作。 插件开发:结合Deepseek进行二次开发,可以创建自定义的CAD插件。例如&a…...

【工具使用】IDEA 社区版如何创建 Spring Boot 项目(详细教程)
IDEA 社区版如何创建 Spring Boot 项目(详细教程) Spring Boot 以其简洁、高效的特性,成为 Java 开发的主流框架之一。虽然 IntelliJ IDEA 专业版提供了Spring Boot 项目向导,但 社区版(Community Edition)…...

QT中串口打开按钮如何点击打开后又能点击关闭
前言: if (!portOpen) { // 打开串口 if (!sp18Controller->initializePort("COM5", 38400)) { QMessageBox::critical(this, "Error", "Failed to open serial port."); return; } ui->btnOpenPort_2->setText("Close…...

【AI深度学习基础】PyTorch初探
引言 PyTorch 是由 Facebook 开源的深度学习框架,专门针对 GPU 加速的深度神经网络编程,它的核心概念包括张量(Tensor)、计算图和自动求导机制。PyTorch作为Facebook开源的深度学习框架,凭借其动态计算图和直观的API设…...

springboot011基于springboot的课程作业管理系统(源码+包运行+LW+技术指导)
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得难了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等,你想解决的问题,今天…...

快速从C过度C++(一):namespace,C++的输入和输出,缺省参数,函数重载
📝前言: 本文章适合有一定C语言编程基础的读者浏览,主要介绍从C语言到C过度,我们首先要掌握的一些基础知识,以便于我们快速进入C的学习,为后面的学习打下基础。 这篇文章的主要内容有: 1&#x…...

PostgreSQL时间计算大全:从时间差到时区转换(保姆级教程)
一、时间计算的三大核心场景 当你遇到这些需求时,本文就是你的救星🌟: 倒计时功能:计算活动剩余天数 用户行为分析:统计操作间隔时间 跨国系统:多时区时间统一管理 报表生成:自动计算同比/环…...

laravel es 相关代码 ElasticSearch
来源: github <?phpnamespace App\Http\Controllers;use Elastic\Elasticsearch\ClientBuilder; use Illuminate\Support\Facades\DB;class ElasticSearch extends Controller {public $client null;public function __construct(){$this->client ClientB…...

题目 3220 ⭐因数计数⭐【数理基础】蓝桥杯2024年第十五届省赛
小蓝随手写出了含有 n n n 个正整数的数组 a 1 , a 2 , ⋅ ⋅ ⋅ , a n {a_1, a_2, , a_n} a1,a2,⋅⋅⋅,an ,他发现可以轻松地算出有多少个有序二元组 ( i , j ) (i, j) (i,j) 满足 a j a_j aj 是 a i a_i ai 的一个因数。因此他定义一个整数对 …...

【Java代码审计 | 第十一篇】SSRF漏洞成因及防范
未经许可,不得转载。 文章目录 SSRF漏洞成因Java中发送HTTP请求的函数1、HttpURLConnection2、HttpClient(Java 11)3、第三方库Request库漏洞示例OkHttpClient漏洞示例HttpClients漏洞示例 漏洞代码示例防范标准代码 SSRF SSRF(S…...

RabbitMQ高级特性--消息确认机制
目录 一、消息确认 1.消息确认机制 2.手动确认方法 二、代码示例 1. AcknowledgeMode.NONE 1.1 配置文件 1.2 生产者 1.3 消费者 1.4 运行程序 2.AcknowledgeMode.AUTO 3.AcknowledgeMode.MANUAL 一、消息确认 1.消息确认机制 生产者发送消息之后,到达消…...

C++复试笔记(一)
Setw 是C中用于设置输出字段宽度的函数。当使用 setw(3) 时,它会设置紧接着的输出字段的最小宽度为3个字符。如果字段内容长度小于3,则会在左侧填充空格以达到指定宽度;如果内容长度大于或等于3,则全部内容将被输出,…...

K8s 1.27.1 实战系列(四)验证集群及应用部署测试
一、验证集群可用性 1、检查节点 kubectl get nodes ------------------------------------------------------ NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 3h48m v1.27.1 k8s-node1 Ready <none> …...

基于Spring Boot的健美操评分管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

H5页面在移动端自动横屏
首先需要再head标签添加这样一段代码 <meta name="viewport" content="width=device-width,height=device-width,initial-scale=1.0,user-scalable=no">因为需求是为了满足WEB端和手机端都可以查看整体效果 但由于UI没有设计移动端的样式 所以我想说…...

【从0到1搞懂大模型】神经网络的实现:数据策略、模型调优与评估体系(3)
一、数据集的划分 (1)按一定比例划分为训练集和测试集 我们通常取8-2、7-3、6-4、5-5比例切分,直接将数据随机划分为训练集和测试集,然后使用训练集来生成模型,再用测试集来测试模型的正确率和误差,以验证…...

从0到1入门RabbitMQ
一、同步调用 优势:时效性强,等待到结果后才返回 缺点: 拓展性差性能下降级联失败问题 二、异步调用 优势: 耦合度低,拓展性强异步调用,无需等待,性能好故障隔离,下游服务故障不影响…...

MySQL数据库复杂的增删改查操作
在前面的文章中,我们主要学习了数据库的基础知识以及基本的增删改查的操作。接下去将以一个比较实际的公司数据库为例子,进行讲解一些较为复杂且现时需求的例子。 基础知识: 一文清晰梳理Mysql 数据库基础知识_字段变动如何梳理清楚-CSDN博…...

点云软件VeloView开发环境搭建与编译
官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程: 安装vs2019,windows sdk,qt5.14.2(没安装到5.15.7),git,cmake3.31,python3.7.9,ninja下载放到…...