Files
aiops/Dockerfile.embed
T
attacker 880cf050fe perf: kubectl 本地复制替代网络下载 (去 install-kubectl.sh 卡点)
- 运行时 kubectl 从 backend/kubectl COPY 进镜像 (58MB 预打包)
- 去除 install-kubectl.sh 网络下载 (~10-30s 耗时)
- go build 已从 77s → 24s (CGO_ENABLED=0 + cache mount)
2026-06-27 02:37:50 +00:00

138 lines
4.7 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.
# ============================================================
# AIOps Embed Dockerfile — 前端嵌入后端二进制,单容器部署
# Stage 1: 构建前端 (Node 20)
# Stage 2: 构建后端 (Go 1.24, go:embed 前端)
# Stage 3: Agent 交叉编译
# Stage 4: 运行时 (Alpine, 单二进制服务前后端)
# 署名 Logan.Li
# ============================================================
ARG VERSION=dev
ARG BUILD_TIME=unknown
ARG GIT_COMMIT=unknown
ARG KUBECTL_VERSION=v1.32.2
# ==================== Stage 1: Frontend Builder ====================
FROM node:20-alpine AS frontend-builder
WORKDIR /app
# 使用淘宝镜像加速
RUN npm config set registry https://registry.npmmirror.com
# 安装依赖(利用 Docker 缓存层)
COPY frontend/package.json frontend/package-lock.json ./
RUN npm ci
# 复制源代码并构建
COPY frontend/ ./
RUN npm run build
# ==================== Stage 2: Backend Builder ====================
FROM golang:1.24-alpine AS backend-builder
ARG VERSION
ARG BUILD_TIME
ARG GIT_COMMIT
ARG TARGETARCH
WORKDIR /app
# 安装构建依赖(纯 Go SQLite 无需 gcc/musl-dev)// Logan.Li
COPY scripts/setup-alpine-mirrors.sh /tmp/setup-alpine-mirrors.sh
RUN chmod +x /tmp/setup-alpine-mirrors.sh && /tmp/setup-alpine-mirrors.sh && \
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 --mount=type=cache,target=/go/pkg/mod \
go mod download
# 复制后端源码
COPY backend/ ./
# ★ 核心:将前端构建产物复制到 embed 目录
RUN rm -rf static && mkdir -p static
COPY --from=frontend-builder /app/dist/ static/
# 构建后端二进制(纯 Go 无 CGO,cache mount 增量编译)// Logan.Li
RUN --mount=type=cache,target=/root/.cache/go-build \
--mount=type=cache,target=/go/pkg/mod \
CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build \
-ldflags="-w -s -X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \
-o aiops .
# ==================== Stage 3: Agent Builder ====================
FROM golang:1.24-alpine AS agent-builder
ARG VERSION
ARG BUILD_TIME
WORKDIR /agent
ENV GOPROXY=https://goproxy.cn,direct
ENV GOSUMDB=off
COPY agent/go.mod agent/go.sum ./
RUN go mod download
COPY 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 . && \
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 4: Runtime ====================
FROM alpine:3.20
ARG TARGETARCH
ARG KUBECTL_VERSION=v1.32.2
# 安装运行时依赖(核心最小集,重型工具改为懒加载)// Logan.Li
# kubectl 从本地 backend/kubectl 复制(预打包进镜像,避免网络下载)// Logan.Li
COPY scripts/setup-alpine-mirrors.sh /tmp/setup-alpine-mirrors.sh
RUN chmod +x /tmp/setup-alpine-mirrors.sh && /tmp/setup-alpine-mirrors.sh && \
apk --no-cache add ca-certificates tzdata bash curl git docker-cli docker-cli-buildx
COPY backend/kubectl /usr/local/bin/kubectl
RUN chmod +x /usr/local/bin/kubectl && \
rm -f /tmp/setup-alpine-mirrors.sh
# Maven 阿里云镜像加速(maven 懒加载后生效)
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 淘宝镜像加速(node 懒加载后生效)
RUN npm config set registry https://registry.npmmirror.com 2>/dev/null || true
ENV TZ=Asia/Shanghai
WORKDIR /app
# 复制后端二进制(前端已嵌入)
COPY --from=backend-builder /app/aiops .
# 创建运行时目录
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 安装脚本
COPY agent/deploy/install.sh /app/agent/deploy/
COPY agent/deploy/aiops-agent.service /app/agent/deploy/
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
CMD ["./aiops"]