流水线用到的Dockerfile和构建脚本build.sh

接着 上一篇文章调用的脚本

流水线通用脚本-shell形式,直接改几个参数,可以拿到Jenkins,github和 gitee和 gitlab等直接调用(主要是Jenkins,改的参数比较少)-CSDN博客

上一篇进榜了嘻嘻

root@jenkins dev-build# cat Dockerfile

###Dockerfile(多阶段构建)

##注意合并指令减少层数

#运行时环境(轻量级使用最小镜像)

##docker.io/library/alpine:latest

##Alpine是一个轻量级的Linux发行版只需要约5MB

##使用国内镜像站下载

#docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/alpine:latest

#crictl images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/alpine:latest

###jdk17镜像

设置环境变量(单层)

##471.47MB

#docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17.0.2-jdk

#crictl images swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17.0.2-jdk

##17-jdk-alpine 325.60MB

#docker pull

#crictl images

#swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17-jdk-alpine

#docker pull

##crictl images

#openjdk:17-jre-slim比 JDK 镜像体积小 60% 以上

#我那个openjdk:17-jre-slim有漏洞这个废弃

#FROM openjdk:17-jdk-slim

##alpine镜像比默认 openjdk体积小 70%+,且减少隐式系统层

#使用镜像站镜像

FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17-jdk-alpine

#使用harbor镜像仓库镜像

#xxxx

#docker.io/library/buildpack-deps

#这是一个包含构建依赖项的Docker镜像。

#它提供各种构建工具和运行库,用于构建不同的应用程序,

#特别是那些使用构建包工具(例如Paketo Buildpacks)的应用程序。

这个镜像本身并不包含应用程序代码,

而是为构建过程提供必要的依赖环境,

从而简化构建过程和镜像大小

swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/buildpack-deps:jammy

#buildpack-deps 上面这个是ubuntu:

##docker pull

##crictl images

设置环境变量(单层)

ENV JAVA_OPTS="-Xms512m -Xmx1024m" \

SPRING_PROFILES_ACTIVE="prod" \

SERVER_PORT=8080

复制 Spring Boot 的可执行ja)(已经包含了所有子模块代码和依赖)

复制构建产物(分离依赖与代码以利用缓存)注入环境变量

ARG ENV_FILE=./env/dev.env

#复制之前打包生成的jar包到指定位置 # 复制环境文件到容器中(使用构建参数 &&# 复制启动脚本

COPY payment-api/target/payment-api-0.0.1-SNAPSHOT.jar app.jar &&COPY ${ENV_FILE} .env &&COPY build/start.sh start.sh

创建用户并设置权限(单层完成所有权限操作)

RUN addgroup -S javauser && adduser -S javauser -G javauser \

&& chown -R javauser:javauser /app \

&& chmod +x start.sh

切换用户

USER javauser

健康检查(单层)

HEALTHCHECK --interval=30s --timeout=3s --start-period=60s --retries=3 \

CMD curl -f http://localhost:${SERVER_PORT}/actuator/health || exit 1

入口点

ENTRYPOINT "./start.sh"

EXPOSE 8080

root@jenkins dev-build# cat build.sh

#!/bin/bash

定义源目录和目标目录

SOURCE_DIR="/home/$repo/java/payment"

TARGET_DIR="$(pwd)/app"

IMAGE_NAME="$镜像仓库域名/命名空间/wallet-test"

DEFAULT_VERSION="s01" # 是jenkins传递的版本号s01 是v构建次数-时间日期方便从 举例v177-20250827-1800

设置基础变量

export LANG=zh_CN.UTF-8

export PATH=/opt/maven-3.9.11/bin:/usr/lib/jvm/jdk-17.0.16-oracle-x64/bin:$PATH

检查参数

if -z "$1" ; then

echo "使用方法: ./build.sh 环境 版本"

echo "支持的环境: dev, uat, prd"

echo ""

echo "示例:"

echo " ./build.sh uat"

echo " ./build.sh prd v1.0.0"

echo " ./build.sh dev"

exit 1

fi

ENV_NAME=$1

VERSION=$DEFAULT_VERSION

验证环境参数

case $ENV_NAME in

"dev")

ENV_FILE=./env/dev.env

IMAGE_TAG=IMAGE_NAME:VERSION

;;

"uat")

ENV_FILE=./tmp/huoma-dzg/server/service/pay-of-java/env/

IMAGE_TAG=IMAGE_NAME:VERSION

;;

"prd")

ENV_FILE=./tmp/huoma-dzg/server/service/pay-of-java/env

IMAGE_TAG=IMAGE_NAME:VERSION

;;

*)

echo "ERROR 不支持的环境: $ENV_NAME"

echo "支持的环境: dev, uat, prd"

exit 1

;;

esac

#调试输出

echo "INFO 构建环境: $ENV_NAME"

#echo "INFO 环境文件: $ENV_FILE"

#echo "INFO 镜像+标签: $IMAGE_TAG"

1.Maven检查并构建

检查 Maven 是否安装

if ! command -v mvn &> /dev/null; then

echo "ERROR Maven 未安装或不在 PATH 中"

exit 1

fi

###这个需要自己进行选择切换的目录根据java环境不同进行切换对应项目下

cd ../

mvn clean install -DskipTests

if $? -ne 0 ; then

echo "ERROR Maven 构建失败!"

exit 1

fi

#/build目录下面存放的是 这个.sh脚本和Dockerfile文件

cd ./build

验证 JAR 包#根据情况修改

###主要是查询对应项目下面有没有生成jar包

###需要手动添加对应关键词

if ! -f "../payment-api/target/"\*.jar ; then

echo "ERROR 未找到生成的 JAR 包"

exit 1

fi

2. Docker 检查

检查 Docker 是否安装

if ! command -v docker &> /dev/null; then

echo "ERROR Docker 未安装或不在 PATH 中"

exit 1

fi

检查 Docker 服务是否运行

if ! docker info &> /dev/null; then

echo "ERROR Docker 服务未运行"

exit 1

fi

3. 检测并删除已存在的同名镜像

echo "检测镜像是否存在: $IMAGE_TAG"

if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^{** IMAGE_NAME**}** :**{ VERSION**}** $"; then

echo "发现已存在镜像 {** IMAGE_NAME**}** :**{ VERSION**}**,执行删除..."

停止关联容器

running_containers=(docker ps -a -q --filter "ancestor=**{** IMAGE_NAME**}** :${ VERSION**}**")

if -n "$running_containers" ; then

echo "停止关联容器:"

docker stop $running_containers

docker rm $running_containers

fi

删除镜像

docker rmi -f "{** IMAGE_NAME**}** :**{ VERSION**}**"

if $? -eq 0 ; then

echo "旧镜像删除成功!"

else

echo "警告:旧镜像删除失败,可能被其他容器引用" >&2

fi

else

echo "未发现同名镜像,继续构建..."

fi

4. 构建Docker镜像

执行 Docker 构建

echo "INFO 执行命令: docker build -f Dockerfile --build-arg ENV_FILE=ENV_FILE -t IMAGE_TAG ."

docker build -f Dockerfile --build-arg ENV_FILE="ENV_FILE" -t "IMAGE_TAG" ../

if $? -ne 0 ; then

echo "ERROR Docker 构建失败!"

exit 1

fi

5. 验证构建结果

# 验证镜像

echo "INFO 验证 Docker 镜像..."

if ! docker images | grep -q "wallet"; then

echo "ERROR Docker 镜像不存在: $IMAGE_TAG"

exit 1

fi

6. 删除临时文件

#rm -rf "$TARGET_DIR"

7. 上传镜像到habor镜像仓库

###docker push "{** IMAGE_NAME**}** :**{ VERSION**}**"

相关推荐
DLYSB_16 小时前
API 网关流量洪峰与突发 CC 攻击:我用 Go 写了个“现场物理防御哨兵”,把故障响应压缩到秒级
开发语言·后端·golang·报警灯
markinmarkin16 小时前
Spring 中Bean 的作用域有哪些?
java·后端·spring
山荷枝17 小时前
Java学习第十天
java·学习
matlabgoodboy18 小时前
计算机毕设代做|Java Python Matlab APP 全套开发设计
java·python·课程设计
雨田言炎18 小时前
四、关于Qt项目需要知道的
开发语言·笔记·qt
程序喵大人18 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
SomeB1oody19 小时前
【RustyML入门】2.6. 线性判别分析
开发语言·后端·机器学习·rust·教程
程序员雷欧19 小时前
环形缓冲区深度解析:从基础原理到Disruptor源码的全面剖析
java
xiaoqiMikko19 小时前
Dependabot 面板全绿,不代表你的 Tomcat 没洞
java·spring boot
前端开发张小七19 小时前
Java 学习笔记 · 第三课:多线程与并发编程(线程、同步、死锁、Lock、乐观锁与悲观锁)
java·后端·程序员