7.idea 使用 docker 构建 spring boot 项目

news2025/7/10 16:04:47

本文目录

  • step 1:编写 Dockerfile 文件
  • step 2:pom.xml 中添加如下配置
  • step 3:maven仓库 setting.xml <servers> 模块下,添加访问自定义仓库的用户名,密码
  • step 4:使用 maven命令开始 clean、package
  • step 5:使用 maven dockerfile 插件,推送镜像至本地仓库
  • step 6:看是否成功推送镜像至 Harbor 本地仓库
  • step 7:linux环境,创建/opt/docker/portal-site文件夹,编写 docker-deploy.sh 脚本
  • step 8:执行脚本启动容器
  • step 9:推荐在 idea 中使用 Alibaba Cloud View 插件

  使用 idea 能构建镜像的 maven 插件,推荐使用 Spotifydockerfile-maven-plugin,它是专门基于 Dockerfile 构建镜像的插件,也是目前市面上用的比较多的镜像构建方式之一。

step 1:编写 Dockerfile 文件

在代码 src 同级,创建名称为 Dockerfile 的文件。

在这里插入图片描述

内容如下:

## 基础镜像
FROM openjdk:17

## 作者
MAINTAINER lzb <xxx@qq.com>

## 定义参数
ARG JAR_FILE

## 创建并进入工作目录
RUN mkdir -p /portal-site
WORKDIR /portal-site

## maven 插件构建时得到 buildArgs 种的值
COPY ${JAR_FILE} portal-site.jar

## 设置 TZ 时区
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms256m -Xmx256m"

## 暴露端口
EXPOSE 8080

## 容器启动命令
## CMD 第一个参数之后的命令可以在运行时被替换
CMD java ${JAVA_OPTS} -jar portal-site.jar

step 2:pom.xml 中添加如下配置

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>1.4.13</version>
    <executions>
        <execution>
            <id>default</id>
            <!-- 自定义构建、推送命令 -->
            <goals>
                <goal>build</goal>
                <goal>push</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- 打包后的完整镜像名:仓库路径/项目名称/镜像名 -->
        <repository>192.168.204.102:8858/portal-site/${project.artifactId}</repository>
        <!-- 镜像版本号 -->
        <tag>${project.version}</tag>
        <!-- 读取 settings.xml 文件中的认证信息 -->
        <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
        <buildArgs>
            <!-- jar 所在目录(JAR_FILE 为 Dockerfile文件中的参数) -->
            <JAR_FILE>target/${project.artifactId}-${project.version}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
</plugin>

step 3:maven仓库 setting.xml <servers> 模块下,添加访问自定义仓库的用户名,密码

<!-- 在 maven 的 settings.xml 文件的 servers 标签中,增加服务认证配置信息-->
<server>
	<id>192.168.204.102:8858</id>   <!-- id中的内容与 configuration 中 的repository中的地址一致-->
	<username>用户名</username>
	<password>密码</password>
</server>

step 4:使用 maven命令开始 clean、package

提示:如果使用本地 docker 打包镜像,Window 本地需安装 Docker Desktop。
执行 clean 操作,然后执行 package 即可
package 打包操作,会在打完包的同时,生成本地 docker 镜像。


错误问题:Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: no further information
解决方式:我使用的是 Docker Desktop 4.23.0,截至 2023-09-15是最新的,需要开启2375端口,如下图所示:
 在这里插入图片描述
 
1.执行 package 命令,开始构建镜像
 
在这里插入图片描述
 
在这里插入图片描述
 
2.本地通过 docker images 命令查看,本地镜像构建成功
 
在这里插入图片描述

step 5:使用 maven dockerfile 插件,推送镜像至本地仓库

在这里插入图片描述

step 6:看是否成功推送镜像至 Harbor 本地仓库

在这里插入图片描述

step 7:linux环境,创建/opt/docker/portal-site文件夹,编写 docker-deploy.sh 脚本

脚本内容如下,以下内容需要根据自己项目来小修改一下

#!/bin/bash

## 第一个参数:up|start|stop|restart|rm
COMMAND=$1
## app 名称
APP_NAME=$2

## 如果没有给 app 名称,默认就叫 app
if [ -z $APP_NAME ]; then
  APP_NAME="portal-site"
fi

## 暴露的端口
EXPOSE_PORT=8081:8081
## 项目/组织
NAMESPACE=portal-site
## 版本号
TAG=1.0

## 仓库地址
REGISTRY_SERVER=192.168.204.102:8858

## 用户名
USERNAME=admin
## 密码
PASSWORD=Harbor12345

## 镜像名称
IMAGE_NAME="$REGISTRY_SERVER/$NAMESPACE/$APP_NAME:$TAG"

## 使用说明,用来提示输入参数
function usage() {
	echo "Usage: sh docker-deploy.sh [up|start|stop|restart|rm]"
	exit 1
}

## 登录仓库
function login() {
  echo "docker login -u $USERNAME --password-stdin $REGISTRY_SERVER"
  echo "$PASSWORD" | docker login -u $USERNAME --password-stdin $REGISTRY_SERVER
}

## 启动容器
function start() {
  # 检查容器是否存在
  CONTAINER_NAME=$(docker ps | grep "$APP_NAME" | awk '{print $NF}')
  # 存在就不启动了
  if [ -n "$CONTAINER_NAME" ]; then
    echo "container $CONTAINER_NAME already started..."
    exit 1
  fi
  # 镜像如果不存在需要先登录
  IMAGE=$(docker images | grep "$APP_NAME" | awk '{print $3}')
  if [ -z "$IMAGE" ]; then
    login
  fi
  # 容器不存在就启动
  echo "starting container $APP_NAME..."
  docker run -d --restart=always --name $APP_NAME -p $EXPOSE_PORT $IMAGE_NAME
  echo "container $APP_NAME started..."
}

## 停止容器
function stop() {
  # 检查容器是否存在
  CONTAINER_NAME=$(docker ps | grep "$APP_NAME" | awk '{print $NF}')

  # 不存在就不需要停止
  if [ -z "$CONTAINER_NAME" ]; then
    echo "container $CONTAINER_NAME not running..."
    exit 1
  fi

  # 存在就停止容器
  echo "stopping container $APP_NAME..."
  docker stop $CONTAINER_NAME
  echo "container $APP_NAME stopped..."
}

## 重启容器
function restart() {
  # 先停止
  stop
  # 再启动
  start
}

## 删除容器、镜像
function rm() {
  # 获取容器名称
  CONTAINER_NAME=$(docker ps | grep "$APP_NAME" | awk '{print $NF}')
  if [ -n "$CONTAINER_NAME" ]; then
    # 停止容器
    stop
    # 删除容器
    echo "removing container $APP_NAME..."
    docker rm $CONTAINER_NAME
    echo "container $APP_NAME removed..."
  fi

  # 获取镜像 id
  IMAGE=$(docker images | grep "$APP_NAME" | awk '{print $3}')
  if [ -n "$IMAGE" ]; then
    # 删除镜像
    echo "removing image $IMAGE..."
    docker rmi $IMAGE
    echo "image $IMAGE removed..."
  fi
}

# 重新拉取镜像并启动容器
function up() {
  # 删除旧的镜像与容器
  rm
  # 拉取新的镜像并启动容器
  start
}

# 根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$COMMAND" in
"up")
	up
;;
"start")
	start
;;
"stop")
	stop
;;
"restart")
	restart
;;
"rm")
	rm
;;
*)
	usage
;;
esac

在这里插入图片描述

step 8:执行脚本启动容器

sh docker-deploy.sh up

step 9:推荐在 idea 中使用 Alibaba Cloud View 插件

可以在 idea 中就可以解决应用的部署启动,省去一步使用连接linux服务器去操作的繁琐。贼拉好用哦

在这里插入图片描述


本文结束,谢谢

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

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

相关文章

蓝牙核心规范(V5.4)10.1-BLE 入门笔记(1)

ble 规范 深入了解蓝牙LE需要熟悉相关的规格。蓝牙LE的架构、程序和协议由一项关键规范完全定义,称为蓝牙核心规范。产品如何使用蓝牙以实现互操作性由两种特殊类型称为配置文件和服务的规范集合所涵盖。图1展示了BLE规范类型及其相互关系。 1.1 蓝牙核心规范 蓝牙核心规范是…

测试行业面临的问题及RunnerGo在工具层面如何解决的

RunnerGo致力于打造成一款企业级全栈测试平台&#xff0c;旨在实现产品生命周期的闭环管理&#xff0c;帮助企业在整个产品生命周期中确保质量、降低风险&#xff0c;并提供卓越的用户体验。采用了较为宽松的Apache-2.0 license开源协议&#xff0c;方便志同道合的朋友一起为开…

VEX —— Noise and Randomness

目录 Noise generators Random number generators Noise generators 噪波生成函数&#xff0c;noise、wnoise、vnoise、onoise、snoise、anoise&#xff1b;每一个函数表示生成噪波的不同算法&#xff1b; 每个噪波相对成本&#xff1a; Perlin noise&#xff08;noise&#…

五十一.DQN原理和实战

值函数近似法 经典强化学习方法的共同点是它们的求解过程都要维持一个值函数表格&#xff0c;策略函数也可以通过一个表格来表示&#xff0c;所以也称这些方法为表格法。表格法要求状态空间和动作空间都是离散的&#xff0c;这类强化学习任务只占所有强化学习任务的很小一部分…

Spring Bean的生命周期和扩展点源码解读

目录 1 Bean的生命周期2 Bean的定义、注册及创建过程3 Bean的注入过程4 Bean的销毁过程5 Bean的生命周期 1 Bean的生命周期 在Spring框架中&#xff0c;Bean对象也有着它的生命周期&#xff0c;然而对于Bean对象的生命周期&#xff0c;我们并不是很清楚&#xff0c;因为Spring帮…

学习pytorch10 神经网络-最大池化的作用

神经网络-最大池化的作用 官方文档参数说明运算演示公式最大池化 代码code 1执行结果code2执行结果 B站小土堆学习视频 https://www.bilibili.com/video/BV1hE411t7RN?p19&spm_id_frompageDriver&vd_source9607a6d9d829b667f8f0ccaaaa142fcb 官方文档 https://pytorch…

UML基础与应用之面向对象

UML&#xff08;Unified Modeling Language&#xff09;是一种用于软件系统建模的标准化语言&#xff0c;它使用图形符号和文本来描述软件系统的结构、行为和交互。在面向对象编程中&#xff0c;UML被广泛应用于软件系统的设计和分析阶段。本文将总结UML基础与应用之面向对象的…

34.KMP算法,拒绝暴力美学

概述 今天我们来聊一聊字符串匹配的问题。 比如有字符串str1 “豫章故那&#xff0c;洪都新府。星分翼轸&#xff0c;地接衡庐。襟三江而带五湖&#xff0c;控蛮荆而引瓯越。”&#xff0c;字符串str2 “襟三江而带五湖”。 现要判断str1是否含有str2&#xff0c;如果有则的…

zabbix介绍及部署(五十一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、zabbix的基本概述 二、zabbix的构成 1、Server 2、web页面 3、数据库 4、proxy 5、Agent 三、zabbix的监控对象 四、zabbix的常用术语 五、zabbix的工作流程 六、za…

区域气象-大气化学在线耦合模式(WRF/Chem)在大气环境领域实践技术应用

大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果&#xff0c;同时气象因素是控制大气污染的关键自然因素。大气污染问题既是局部、当地的&#xff0c;也是区域的&#xff0c;甚至是全球的。本地的污染物排放除了对当地造成严重影响外&#xff0c;同时还会在…

基于docker进行Grafana + prometheus实现服务监听

基于docker进行Grafana Prometheus实现服务监听 Grafana安装Prometheus安装Jvm监控配置 Grafana安装 docker pull grafana/grafanamkdir /server/grafanachmod 777 /server/grafanadocker run -d -p 3000:3000 --namegrafana -v /server/grafana:/var/lib/grafana grafana/gr…

Databend 开源周报第 111 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 理解 SHARE END…

9、DVWA——XSS(Stored)

文章目录 一、存储型XSS概述二、low2.1 源码分析2.2 通关分析 三、medium3.1 源码分析3.2 通关思路 四、high4.1 源码分析4.2 通关思路 一、存储型XSS概述 XSS&#xff0c;全称Cross Site Scripting&#xff0c;即跨站脚本攻击&#xff0c;某种意义上也是一种注入攻击&#xff…

MATLAB中filloutliers函数用法

目录 语法 说明 示例 在向量中对离群值进行插值 使用均值检测和最邻近值填充方法 使用移窗检测法 填充矩阵行中的离群值 指定离群值位置 返回离群值阈值 filloutliers函数功能是检测并替换数据中的离群值。 语法 B filloutliers(A,fillmethod) B filloutliers(A,f…

Paper Reading: RSPrompter,基于视觉基础模型的遥感实例分割提示学习

目录 简介目标工作重点方法实验总结 简介 题目&#xff1a;《RSPrompter: Learning to Prompt for Remote Sensing Instance Segmentation based on Visual Foundation Model 》&#xff0c;基于视觉基础模型的遥感实例分割提示学习 日期&#xff1a;2023.6.28 单位&#xf…

接口测试学习

1、curl 命令 无参&#xff1a;curl -X POST -H"Authorization: abcdefghijklmn" https://xxx.xxxxx.com/xxxx 有参&#xff1a;curl -X POST -H"Authorization:abcdefghijklmn " -H"Content-Type:application/json" https://xxx.xxxxx.com/…

synchronized锁详解

本文主要是对synchronized使用各个情况&#xff0c;加解锁底层原理的讲解 一&#xff0c;重量级锁 对象头 讲重量级锁之前&#xff0c;先了解一下一个对象的构成&#xff0c;一个对象是由对象头和对象体组成的&#xff0c;本文主要讲对象头&#xff0c;对象体其实就是对象的…

核心实验21_BGP高级(了解)(配置略)_ENSP

项目场景&#xff1a; 核心实验21_BGP基础_ENSP 通过bgp实现省市互通。 实搭拓扑图&#xff1a; 具体操作&#xff1a; 其他基础配置略&#xff08;接口地址&#xff0c;ospf&#xff09; 1.BGP邻居建立&#xff1a; R1: [R1]bgp 200 [R1-bgp]peer 10.2.2.2 as-number 200 …

Java高级之File类、节点流、缓冲流、转换流、标准I/O流、打印流、数据流

第13章 IO流 文章目录 一、File类的使用1.1、如何创建File类的实例1.2、常用方法1.2.1、File类的获取功能1.2.2、File类的重命名功能1.2.3、File类的判断功能1.2.4、File类的创建功能1.2.5、File类的删除功能 二、IO流原理及流的分类2.1、Java IO原理2.2、流的分类/体系结构 三…

LINUX内核启动流程-2

向32位模式转变,为main函数的调用做准备 1、关中断并将system移动到内存地址起始位置0x00000 1.1 关中断:将CPU的标志寄存器(EFLAGS)中的中断允许标志(IF)置0。 main函数中能够适应保护模式的中断服务体系被重建完毕才会打开中断,而那时候响应中断的服务程序将不再是…