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 启动 =========="