From 8c272a6fa694d3df011c415a4e2e2c07e77eefb1 Mon Sep 17 00:00:00 2001 From: attacker Date: Sun, 21 Jun 2026 21:55:03 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20BuildKit=20cache=20mount=20=E5=8A=A0?= =?UTF-8?q?=E9=80=9F=20Docker=20=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化: - Dockerfile 加 # syntax=docker/dockerfile:1 启用 BuildKit frontend - go mod download / go build 加 --mount=type=cache (GOMODCACHE + GOCACHE) - apk add 加 --mount=type=cache=/var/cache/apk - alpine:latest → alpine:3.20 固定版本(避免 :latest 变动导致全量 cache miss) - run.sh 加 DOCKER_BUILDKIT=1 + COMPOSE_DOCKER_CLI_BUILD=1 效果: - 首次构建不变(需填充缓存) - 第二次起: go build 增量编译(仅重编译改动包),apk 从缓存恢复 - 预估: 13分钟 → 2分钟 --- backend/Dockerfile | 38 ++++++++++++++++++++++++++++---------- run.sh | 5 +++++ 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 4576a1f..3ef8ced 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,8 +1,9 @@ +# syntax=docker/dockerfile:1 # ============================================================ -# AIOps Backend + Agent 多阶段 Dockerfile +# AIOps Backend + Agent 多阶段 Dockerfile (BuildKit 加速版) # Stage 1: 编译后端 (Go 1.24) # Stage 2: 交叉编译 Agent (Go 1.24, linux-amd64/arm64 + darwin-arm64) -# Stage 3: 运行时 (Alpine) +# Stage 3: 运行时 (Alpine 3.20 固定版本) # 署名 Logan.Li # ============================================================ @@ -22,16 +23,23 @@ RUN apk add --no-cache git ca-certificates tzdata ENV TZ=Asia/Shanghai ENV GOPROXY=https://goproxy.cn,direct ENV GONOSUMCHECK=* +ENV GOMODCACHE=/go/pkg/mod +ENV GOCACHE=/root/.cache/go-build # 复制后端 go.mod(利用 Docker 层缓存) COPY backend/go.mod backend/go.sum ./ -RUN go mod download +# --mount=type=cache 让 go mod download 的结果跨构建复用 // Logan.Li +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go mod download # 复制后端源码 COPY backend/ ./ -# 构建后端二进制(注入版本号) -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ +# 构建后端二进制(注入版本号)— cache mount 让增量编译极快 +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ -ldflags="-w -s -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME}" \ -o aiops ./cmd/ @@ -42,27 +50,37 @@ WORKDIR /agent ENV GOPROXY=https://goproxy.cn,direct ENV GOSUMDB=off +ENV GOMODCACHE=/go/pkg/mod +ENV GOCACHE=/root/.cache/go-build # 复制 agent go.mod COPY agent/go.mod agent/go.sum ./ -RUN go mod download +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go mod download # 复制 agent 源码 COPY agent/ ./ # 交叉编译三个平台的 agent 二进制(注入版本号) -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -X main.version=${VERSION} -X main.buildTime=${BUILD_TIME}" -o bin/aiops-agent-linux-amd64 . && \ +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -X main.version=${VERSION} -X main.buildTime=${BUILD_TIME}" -o bin/aiops-agent-linux-amd64 . && \ CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w -X main.version=${VERSION} -X main.buildTime=${BUILD_TIME}" -o bin/aiops-agent-linux-arm64 . && \ CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w -X main.version=${VERSION} -X main.buildTime=${BUILD_TIME}" -o bin/aiops-agent-darwin-arm64 . # ==================== Stage 3: Runtime ==================== -FROM alpine:latest +# 固定版本避免 :latest 每次变动导致全量 cache 失效 // Logan.Li +FROM alpine:3.20 # 使用国内 Alpine 镜像源加速 // Logan.Li RUN sed -i 's|dl-cdn.alpinelinux.org|mirrors.aliyun.com|g' /etc/apk/repositories -# 安装运行时依赖(bash=kubectl交互终端,curl=健康检查,openssh-client=SSH远程安装agent,kubectl=集群命令行管理,ansible=自动化运维,nodejs+npm=前端构建,maven=Java构建) -RUN apk --no-cache add ca-certificates tzdata bash curl openssh-client ansible sshpass git docker-cli docker-cli-buildx nodejs npm maven && \ +# 安装运行时依赖(apk cache mount 加速重装) +# bash=kubectl交互终端,curl=健康检查,openssh-client=SSH远程安装agent +# kubectl=集群命令行管理,ansible=自动化运维,nodejs+npm=前端构建,maven=Java构建 +RUN --mount=type=cache,target=/var/cache/apk \ + apk add ca-certificates tzdata bash curl openssh-client ansible sshpass git docker-cli docker-cli-buildx nodejs npm maven && \ curl -sLO "https://dl.k8s.io/release/$(curl -sL https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && \ chmod +x kubectl && mv kubectl /usr/local/bin/ diff --git a/run.sh b/run.sh index bd7c4e4..9d855bb 100755 --- a/run.sh +++ b/run.sh @@ -325,6 +325,11 @@ cmd_docker() { info "使用: $DOCKER_COMPOSE" info "版本: $VERSION (构建时间: $BUILD_TIME)" + # 启用 BuildKit 加速构建(cache mount 跨构建复用 go mod/apk 缓存)// Logan.Li + export DOCKER_BUILDKIT=1 + export COMPOSE_DOCKER_CLI_BUILD=1 + info "BuildKit: 已启用 (增量编译 + 缓存复用)" + case "$action" in up) banner "========== Docker Compose 启动 =========="