From 9215cd9b8ccc6a8062d6a83f9eeb0a7b2818c32a Mon Sep 17 00:00:00 2001 From: "Logan.Li" Date: Fri, 26 Jun 2026 19:06:57 +0800 Subject: [PATCH] =?UTF-8?q?fix(docker):=20=E6=9E=84=E5=BB=BA=E6=97=B6?= =?UTF-8?q?=E6=8C=89=20TARGETARCH=20=E4=B8=8B=E8=BD=BD=20kubectl=EF=BC=8C?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=20backend/kubectl=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 scripts/install-kubectl.sh,支持 linux amd64/arm64 - Dockerfile.embed 后端 CGO 编译跟随 TARGETARCH,修复 Mac ARM 构建失败 - backend/Dockerfile 同步改为构建时下载 kubectl --- Dockerfile.embed | 20 +++++++++++------- backend/Dockerfile | 15 ++++++++----- scripts/install-kubectl.sh | 43 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 12 deletions(-) create mode 100755 scripts/install-kubectl.sh diff --git a/Dockerfile.embed b/Dockerfile.embed index fae14e7..9c4ba2e 100644 --- a/Dockerfile.embed +++ b/Dockerfile.embed @@ -10,6 +10,7 @@ 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 @@ -33,6 +34,7 @@ FROM golang:1.24-alpine AS backend-builder ARG VERSION ARG BUILD_TIME ARG GIT_COMMIT +ARG TARGETARCH WORKDIR /app @@ -55,9 +57,8 @@ COPY backend/ ./ RUN rm -rf static && mkdir -p static COPY --from=frontend-builder /app/dist/ static/ -# 构建后端二进制(前端已嵌入,注入版本号) -# local 模式需 CGO(SQLite + redka/mattn-sqlite3)// Logan.Li -RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build \ +# 构建后端二进制(跟随 TARGETARCH,Mac ARM 构建 linux/arm64 避免 CGO 交叉编译失败)// Logan.Li +RUN CGO_ENABLED=1 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 . @@ -84,17 +85,22 @@ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -X main.vers # ==================== Stage 4: Runtime ==================== FROM alpine:latest +ARG TARGETARCH +ARG KUBECTL_VERSION=v1.32.2 + # 使用国内 Alpine 镜像源加速 RUN sed -i 's|dl-cdn.alpinelinux.org|mirrors.tuna.tsinghua.edu.cn|g' /etc/apk/repositories # 安装运行时依赖(核心最小集,重型工具改为懒加载)// Logan.Li # bash=kubectl交互终端, curl=健康检查, git=流水线代码拉取, docker-cli=镜像构建推送 -# kubectl=预装(~50MB),maven/nodejs/helm → 工具配置Tab懒加载 +# kubectl 按 TARGETARCH 构建时下载(linux/amd64|arm64),无需本地 backend/kubectl // Logan.Li RUN apk --no-cache add ca-certificates tzdata bash curl git docker-cli docker-cli-buildx -# kubectl 预装(本地打包进镜像,避免 Docker build 时网络下载)// Logan.Li -COPY backend/kubectl /usr/local/bin/kubectl -RUN chmod +x /usr/local/bin/kubectl +COPY scripts/install-kubectl.sh /tmp/install-kubectl.sh +RUN chmod +x /tmp/install-kubectl.sh && \ + TARGET_OS=linux TARGET_ARCH="${TARGETARCH}" KUBECTL_VERSION="${KUBECTL_VERSION}" \ + /tmp/install-kubectl.sh /usr/local/bin/kubectl && \ + rm -f /tmp/install-kubectl.sh # Maven 阿里云镜像加速(maven 懒加载后生效) RUN mkdir -p /root/.m2 && \ diff --git a/backend/Dockerfile b/backend/Dockerfile index aa8c4e4..e1a868c 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -10,6 +10,7 @@ # 构建参数 — 版本号通过 git tag 或环境变量注入 ARG VERSION=dev ARG BUILD_TIME=unknown +ARG KUBECTL_VERSION=v1.32.2 # ==================== Stage 1: Backend Builder ==================== FROM golang:1.24-alpine AS builder @@ -76,19 +77,23 @@ RUN --mount=type=cache,target=/go/pkg/mod \ # 固定版本避免 :latest 每次变动导致全量 cache 失效 // Logan.Li FROM alpine:3.20 +ARG TARGETARCH +ARG KUBECTL_VERSION=v1.32.2 + # 使用国内 Alpine 镜像源加速 // Logan.Li RUN sed -i 's|dl-cdn.alpinelinux.org|mirrors.tuna.tsinghua.edu.cn|g' /etc/apk/repositories # 安装运行时依赖(核心最小集,重型工具改为懒加载)// Logan.Li # bash=kubectl交互终端, curl=健康检查, git=流水线代码拉取, docker-cli=镜像构建推送 -# kubectl=预装(~50MB,K8s交互终端必需),maven/nodejs/helm → 工具配置Tab懒加载 -# Pod文件浏览/exec 通过 WebSocket channel 协议直连 K8s API,无需 kubectl +# kubectl 按 TARGETARCH 下载(linux/amd64|arm64)// Logan.Li RUN --mount=type=cache,target=/var/cache/apk \ apk add ca-certificates tzdata bash curl git docker-cli docker-cli-buildx -# kubectl 预装(~50MB,本地打包进镜像,避免 Docker build 时网络下载)// Logan.Li -COPY backend/kubectl /usr/local/bin/kubectl -RUN chmod +x /usr/local/bin/kubectl +COPY scripts/install-kubectl.sh /tmp/install-kubectl.sh +RUN chmod +x /tmp/install-kubectl.sh && \ + TARGET_OS=linux TARGET_ARCH="${TARGETARCH}" KUBECTL_VERSION="${KUBECTL_VERSION}" \ + /tmp/install-kubectl.sh /usr/local/bin/kubectl && \ + rm -f /tmp/install-kubectl.sh # npm 淘宝镜像加速(node 懒加载后生效) RUN npm config set registry https://registry.npmmirror.com 2>/dev/null || true diff --git a/scripts/install-kubectl.sh b/scripts/install-kubectl.sh new file mode 100755 index 0000000..8e01d8a --- /dev/null +++ b/scripts/install-kubectl.sh @@ -0,0 +1,43 @@ +#!/bin/sh +# 按目标 OS/ARCH 下载 kubectl(Docker 构建 / 本地脚本共用)// Logan.Li +set -eu + +KUBECTL_VERSION="${KUBECTL_VERSION:-v1.32.2}" +TARGET_OS="${TARGET_OS:-linux}" +TARGET_ARCH="${TARGET_ARCH:-amd64}" +DEST="${1:-/usr/local/bin/kubectl}" + +case "${TARGET_ARCH}" in + amd64|x86_64) KARCH=amd64 ;; + arm64|aarch64) KARCH=arm64 ;; + *) + echo "[install-kubectl] 不支持的架构: ${TARGET_ARCH}" >&2 + exit 1 + ;; +esac + +# 容器内固定 linux;本地 Mac 调试可 TARGET_OS=darwin +case "${TARGET_OS}" in + linux|darwin) ;; + *) + echo "[install-kubectl] 不支持的平台: ${TARGET_OS}" >&2 + exit 1 + ;; +esac + +PRIMARY="https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGET_OS}/${KARCH}/kubectl" +FALLBACK="https://storage.googleapis.com/kubernetes-release/release/${KUBECTL_VERSION}/bin/${TARGET_OS}/${KARCH}/kubectl" + +echo "[install-kubectl] ${TARGET_OS}/${KARCH} ${KUBECTL_VERSION} -> ${DEST}" + +if curl -fsSL --retry 3 --retry-delay 2 --connect-timeout 20 "${PRIMARY}" -o "${DEST}"; then + : +elif curl -fsSL --retry 3 --retry-delay 2 --connect-timeout 20 "${FALLBACK}" -o "${DEST}"; then + echo "[install-kubectl] 使用备用源: ${FALLBACK}" +else + echo "[install-kubectl] 下载失败: ${PRIMARY}" >&2 + exit 1 +fi + +chmod +x "${DEST}" +"${DEST}" version --client=true 2>/dev/null || true \ No newline at end of file