From 6f877fa3bd410811887b1add9656675d3080198e Mon Sep 17 00:00:00 2001 From: engigu Date: Tue, 23 Dec 2025 10:59:38 +0800 Subject: [PATCH] feat: adjust docker image build --- Dockerfile | 57 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/Dockerfile b/Dockerfile index 02c33da..a5b17e2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,6 @@ +# ================================ # Stage 1: Build frontend +# ================================ FROM node:20-alpine AS frontend-builder WORKDIR /app/web @@ -15,59 +17,70 @@ COPY web/ ./ # Build frontend RUN npm run build +# ================================ # Stage 2: Build backend +# ================================ FROM --platform=$BUILDPLATFORM golang:1.24-alpine AS backend-builder ARG TARGETOS ARG TARGETARCH +ARG VERSION=dev +ARG BUILD_TIME WORKDIR /app -# Copy go mod files COPY go.mod go.sum ./ RUN go env -w GOPROXY=https://goproxy.cn,direct && go mod download -# Copy source code COPY . . -# Copy built frontend to embed location +# Copy frontend dist COPY --from=frontend-builder /app/web/dist ./internal/static/dist -# Build Go binary with cross-compilation (native speed, no QEMU) -ARG VERSION=dev -ARG BUILD_TIME -RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -ldflags="-s -w -X baihu/internal/constant.Version=${VERSION} -X 'baihu/internal/constant.BuildTime=${BUILD_TIME}'" -o baihu . +# Build Go binary +RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} \ + go build -ldflags="-s -w -X baihu/internal/constant.Version=${VERSION} -X 'baihu/internal/constant.BuildTime=${BUILD_TIME}'" \ + -o baihu . -# Stage 3: Final image based on Dockerfile.debian +# ================================ +# Stage 3: Final image +# ================================ FROM debian:bookworm-slim ENV TZ=Asia/Shanghai +ENV PATH="/opt/venv/bin:$PATH" -RUN sed -i 's@deb.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \ - && sed -i 's@security.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \ +# 安装必要系统工具 + Node + Python +RUN sed -i 's@deb.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list \ + && sed -i 's@security.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list \ && echo "${TZ}" > /etc/timezone \ && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ - && apt update \ - && apt install -y tzdata git gcc curl wget vim nodejs npm python3 python3-venv python3-pip \ - && python3 -m venv /opt/basepy3 \ - && source /opt/basepy3/bin/activate \ - && rm -rf /var/lib/apt/lists/* \ - && python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple + && apt-get update \ + && apt-get install -y --no-install-recommends \ + tzdata git gcc curl wget vim nodejs npm python3 python3-venv python3-pip \ + && python3 -m venv /opt/venv \ + && /opt/venv/bin/pip install --upgrade pip \ + && /opt/venv/bin/pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \ + # 设置虚拟环境 Python 为系统默认 + && update-alternatives --install /usr/bin/python python /opt/venv/bin/python 1 \ + && update-alternatives --install /usr/bin/python3 python3 /opt/venv/bin/python 1 \ + && update-alternatives --install /usr/bin/pip pip /opt/venv/bin/pip 1 \ + && update-alternatives --install /usr/bin/pip3 pip3 /opt/venv/bin/pip 1 \ + && rm -rf /var/lib/apt/lists/* WORKDIR /app -# Copy binary from builder +# Copy Go binary COPY --from=backend-builder /app/baihu . -# Copy config files -COPY --from=backend-builder /app/configs ./configs +# Copy frontend dist folder +COPY --from=frontend-builder /app/web/dist ./internal/static/dist -# Copy entrypoint script +# Copy configs and entrypoint +COPY --from=backend-builder /app/configs ./configs COPY docker-entrypoint.sh . RUN chmod +x docker-entrypoint.sh -# Expose port EXPOSE 8052 -# Run with entrypoint CMD ["./docker-entrypoint.sh"]