Files
aiops/backend/Dockerfile
T
attacker 8c272a6fa6 perf: BuildKit cache mount 加速 Docker 构建
优化:
- 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分钟
2026-06-21 21:55:03 +08:00

123 lines
4.8 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# syntax=docker/dockerfile:1
# ============================================================
# AIOps Backend + Agent 多阶段 Dockerfile (BuildKit 加速版)
# Stage 1: 编译后端 (Go 1.24)
# Stage 2: 交叉编译 Agent (Go 1.24, linux-amd64/arm64 + darwin-arm64)
# Stage 3: 运行时 (Alpine 3.20 固定版本)
# 署名 Logan.Li
# ============================================================
# 构建参数 — 版本号通过 git tag 或环境变量注入
ARG VERSION=dev
ARG BUILD_TIME=unknown
# ==================== Stage 1: Backend Builder ====================
FROM golang:1.24-alpine AS builder
WORKDIR /app
# 使用国内 Alpine 镜像源加速 // Logan.Li
RUN sed -i 's|dl-cdn.alpinelinux.org|mirrors.aliyun.com|g' /etc/apk/repositories
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 ./
# --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/ ./
# 构建后端二进制(注入版本号)— 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/
# ==================== Stage 2: Agent Builder ====================
FROM golang:1.24-alpine AS agent-builder
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 --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
go mod download
# 复制 agent 源码
COPY agent/ ./
# 交叉编译三个平台的 agent 二进制(注入版本号)
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 ====================
# 固定版本避免 :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
# 安装运行时依赖(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/
# Maven 阿里云镜像加速(避免 DNS 间歇性 SERVFAIL)
RUN mkdir -p /root/.m2 && \
echo '<?xml version="1.0" encoding="UTF-8"?><settings><mirrors><mirror><id>aliyun</id><mirrorOf>central</mirrorOf><name>Aliyun Maven</name><url>https://maven.aliyun.com/repository/public</url></mirror></mirrors></settings>' > /root/.m2/settings.xml
# npm 淘宝镜像加速
RUN npm config set registry https://registry.npmmirror.com
ENV TZ=Asia/Shanghai
WORKDIR /app
# 复制后端二进制
COPY --from=builder /app/aiops .
# 创建运行时目录(agent 二进制 + 安装脚本)
RUN mkdir -p /app/agent/bin /app/agent/deploy
# 复制 agent 二进制(三个平台)
COPY --from=agent-builder /agent/bin/aiops-agent-linux-amd64 /app/agent/bin/
COPY --from=agent-builder /agent/bin/aiops-agent-linux-arm64 /app/agent/bin/
COPY --from=agent-builder /agent/bin/aiops-agent-darwin-arm64 /app/agent/bin/
# 复制 agent 安装脚本和 systemd service 模板
COPY agent/deploy/install.sh /app/agent/deploy/
COPY agent/deploy/aiops-agent.service /app/agent/deploy/
# 启动脚本(注入 hosts DNS 缓存)
COPY backend/entrypoint.sh /app/
RUN chmod +x /app/entrypoint.sh
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
CMD ["./entrypoint.sh"]