fix(docker): 构建时按 TARGETARCH 下载 kubectl,移除 backend/kubectl 依赖
- 新增 scripts/install-kubectl.sh,支持 linux amd64/arm64 - Dockerfile.embed 后端 CGO 编译跟随 TARGETARCH,修复 Mac ARM 构建失败 - backend/Dockerfile 同步改为构建时下载 kubectl
This commit is contained in:
1 parent
e8d79e409f
commit
9215cd9b8c
3 files changed
+66
-12
No files matched your search
+13
-7
@@ -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 && \
|
||||
|
||||
+10
-5
@@ -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
|
||||
|
||||
Executable
+43
@@ -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
|
||||
Reference in new issue
Block a user