diff --git a/.drone.yml b/.drone.yml index 64f7e56..5a6c2c4 100644 --- a/.drone.yml +++ b/.drone.yml @@ -162,6 +162,8 @@ steps: volumes: - name: dockersock path: /var/run/docker.sock + environment: + DOCKER_BUILDKIT: "1" commands: - | echo "====== 开始构建 Docker 镜像 ======" @@ -174,11 +176,20 @@ steps: fi echo "版本: $APP_VERSION" + # 拉取之前的镜像作为缓存来源(加速 layer 复用) + echo "正在拉取缓存镜像..." + docker pull "$IMAGE_NAME:latest" 2>/dev/null || true + docker pull "$LOCAL_HARBOR_REG/$LOCAL_HARBOR_PROJ/$IMAGE_NAME:latest" 2>/dev/null || true + + # 使用 BuildKit 构建,启用缓存 docker build \ - -t "$IMAGE_NAME:$BUILD_VERSION" \ - -t "$IMAGE_NAME:latest" \ + --cache-from "$IMAGE_NAME:latest" \ + --cache-from "$LOCAL_HARBOR_REG/$LOCAL_HARBOR_PROJ/$IMAGE_NAME:latest" \ + --build-arg BUILDKIT_INLINE_CACHE=1 \ --build-arg VERSION="$APP_VERSION" \ --build-arg BUILD_TIME="$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M')" \ + -t "$IMAGE_NAME:$BUILD_VERSION" \ + -t "$IMAGE_NAME:latest" \ -f par-api/Dockerfile \ . diff --git a/par-api/Dockerfile b/par-api/Dockerfile index f0bdaac..cbf8957 100644 --- a/par-api/Dockerfile +++ b/par-api/Dockerfile @@ -1,14 +1,18 @@ +# syntax=docker/dockerfile:1 # PAR Server - 前后端一体化 Docker 镜像 # 参考 mediabot 的多阶段构建方式 +# 启用 BuildKit 以支持 cache mount # 第一阶段:构建前端 FROM 192.168.31.253/library/node:22-alpine AS web-builder WORKDIR /app COPY web/package.json web/package-lock.json ./ -RUN npm ci --ignore-scripts +RUN --mount=type=cache,target=/root/.npm \ + npm ci --ignore-scripts COPY web/ . -RUN npm run build +RUN --mount=type=cache,target=/root/.npm \ + npm run build # 第二阶段:构建后端 # mediabot 使用 maven-java21 镜像(已含 JDK + Maven) @@ -22,8 +26,9 @@ COPY par-common/pom.xml par-common/ COPY par-core/pom.xml par-core/ COPY par-api/pom.xml par-api/ -# 下载依赖(缓存层) -RUN mvn dependency:go-offline -B +# 下载依赖(使用 cache mount 缓存 Maven 仓库) +RUN --mount=type=cache,target=/root/.m2,sharing=locked \ + mvn dependency:go-offline -B # 复制源码并构建 COPY par-common/src par-common/src @@ -33,7 +38,9 @@ COPY par-api/src par-api/src # 将前端构建产物复制到后端静态资源目录 COPY --from=web-builder /app/dist par-api/src/main/resources/static -RUN mvn clean package -DskipTests -B && \ +# 打包(使用 cache mount 缓存 Maven 仓库) +RUN --mount=type=cache,target=/root/.m2,sharing=locked \ + mvn clean package -DskipTests -B && \ mkdir -p target && \ cp par-api/target/*.jar target/app.jar