From 2dd51a1018328564f78c07f2645d0d8c287a04fb Mon Sep 17 00:00:00 2001 From: engigu Date: Sun, 11 Jan 2026 21:44:08 +0800 Subject: [PATCH] fix: speed up building --- .github/workflows/build-base.yml | 133 +++++++++++++++++++++++++++++++ Dockerfile | 20 ++--- Dockerfile.base | 15 ++++ 3 files changed, 158 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/build-base.yml create mode 100644 Dockerfile.base diff --git a/.github/workflows/build-base.yml b/.github/workflows/build-base.yml new file mode 100644 index 0000000..567b547 --- /dev/null +++ b/.github/workflows/build-base.yml @@ -0,0 +1,133 @@ +name: Build-Base-Image + +on: + workflow_dispatch: # 手动触发 + push: + branches: + - main + paths: + - 'Dockerfile.base' + +env: + REGISTRY: ghcr.io + IMAGE_NAME: baihu + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + platform: + - linux/amd64 + - linux/arm64 + + permissions: + contents: read + packages: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set platform pair + id: platform + run: | + platform=${{ matrix.platform }} + echo "pair=${platform//\//-}" >> $GITHUB_OUTPUT + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }} + tags: | + type=raw,value=base + + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile.base + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true + cache-from: type=gha,scope=base-${{ steps.platform.outputs.pair }} + cache-to: type=gha,scope=base-${{ steps.platform.outputs.pair }},mode=max + provenance: false + + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ steps.platform.outputs.pair }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + needs: build + + permissions: + contents: read + packages: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests-* + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }} + tags: | + type=raw,value=base + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:base diff --git a/Dockerfile b/Dockerfile index 23261df..e8eb2d5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -104,21 +104,21 @@ RUN VERSION_VAL=$(cat /build-info/version.txt) && \ # ================================ # Stage 4: Final image # ================================ -FROM debian:bookworm-slim +FROM ghcr.io/engigu/baihu:base ENV TZ=Asia/Shanghai ENV PATH="/app/envs/node/bin:/app/envs/python/bin:$PATH" ENV NODE_PATH="/app/envs/node/lib/node_modules" -# 安装必要系统工具 + Node + Python -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 \ - && echo "${TZ}" > /etc/timezone \ - && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ - && apt-get update \ - && apt-get install -y --no-install-recommends \ - tzdata git gcc curl wget vim nodejs htop npm python3 python3-venv python3-pip \ - && rm -rf /var/lib/apt/lists/* +# # 安装必要系统工具 + Node + Python +# 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 \ +# && echo "${TZ}" > /etc/timezone \ +# && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ +# && apt-get update \ +# && apt-get install -y --no-install-recommends \ +# tzdata git gcc curl wget vim nodejs htop npm python3 python3-venv python3-pip \ +# && rm -rf /var/lib/apt/lists/* WORKDIR /app diff --git a/Dockerfile.base b/Dockerfile.base new file mode 100644 index 0000000..1d7ffd6 --- /dev/null +++ b/Dockerfile.base @@ -0,0 +1,15 @@ +FROM debian:bookworm-slim + +ENV TZ=Asia/Shanghai +ENV PATH="/app/envs/node/bin:/app/envs/python/bin:$PATH" +ENV NODE_PATH="/app/envs/node/lib/node_modules" + +# 安装必要系统工具 + Node + Python +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 \ + && echo "${TZ}" > /etc/timezone \ + && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + tzdata git gcc curl wget vim nodejs htop npm python3 python3-venv python3-pip \ + && rm -rf /var/lib/apt/lists/*