diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index b0378532d1..1bee1bc4a7 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -13,6 +13,15 @@ jobs: build-nightly-image: if: github.repository == 'AstrBotDevs/AstrBot' && github.event_name == 'schedule' runs-on: ubuntu-latest + strategy: + matrix: &docker_matrix + include: + - type: standard + file: Dockerfile + tag_suffix: "" + - type: minimal + file: Dockerfile.minimal + tag_suffix: "-minimal" env: DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }} GHCR_OWNER: astrbotdevs @@ -44,17 +53,6 @@ jobs: if: github.event_name == 'schedule' && steps.check-commits.outputs.has_commits == 'false' run: exit 0 - - name: Build Dashboard - run: | - cd dashboard - npm install - npm run build - mkdir -p dist/assets - echo $(git rev-parse HEAD) > dist/assets/version - cd .. - mkdir -p data - cp -r dashboard/dist data/ - - name: Determine test image tags id: test-meta run: | @@ -86,12 +84,12 @@ jobs: - name: Build nightly image tags list id: test-tags run: | - TAGS="${{ env.DOCKER_HUB_USERNAME }}/astrbot:nightly-latest - ${{ env.DOCKER_HUB_USERNAME }}/astrbot:nightly-${{ steps.test-meta.outputs.build_date }}-${{ steps.test-meta.outputs.short_sha }}" + TAGS="${{ env.DOCKER_HUB_USERNAME }}/astrbot:nightly-latest${{ matrix.tag_suffix }} + ${{ env.DOCKER_HUB_USERNAME }}/astrbot:nightly-${{ steps.test-meta.outputs.build_date }}-${{ steps.test-meta.outputs.short_sha }}${{ matrix.tag_suffix }}" if [ "${{ env.HAS_GHCR_TOKEN }}" = "true" ]; then TAGS="$TAGS - ghcr.io/${{ env.GHCR_OWNER }}/astrbot:nightly-latest - ghcr.io/${{ env.GHCR_OWNER }}/astrbot:nightly-${{ steps.test-meta.outputs.build_date }}-${{ steps.test-meta.outputs.short_sha }}" + ghcr.io/${{ env.GHCR_OWNER }}/astrbot:nightly-latest${{ matrix.tag_suffix }} + ghcr.io/${{ env.GHCR_OWNER }}/astrbot:nightly-${{ steps.test-meta.outputs.build_date }}-${{ steps.test-meta.outputs.short_sha }}${{ matrix.tag_suffix }}" fi echo "tags<> $GITHUB_OUTPUT echo "$TAGS" >> $GITHUB_OUTPUT @@ -101,6 +99,7 @@ jobs: uses: docker/build-push-action@v7.0.0 with: context: . + file: ${{ matrix.file }} platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.test-tags.outputs.tags }} @@ -116,6 +115,9 @@ jobs: GHCR_OWNER: astrbotdevs HAS_GHCR_TOKEN: ${{ secrets.GHCR_GITHUB_TOKEN != '' }} + strategy: + matrix: *docker_matrix + steps: - name: Checkout uses: actions/checkout@v6 @@ -151,17 +153,6 @@ jobs: fi echo "version=$version" >> $GITHUB_OUTPUT - - name: Build Dashboard - run: | - cd dashboard - npm install - npm run build - mkdir -p dist/assets - echo $(git rev-parse HEAD) > dist/assets/version - cd .. - mkdir -p data - cp -r dashboard/dist data/ - - name: Set QEMU uses: docker/setup-qemu-action@v4.0.0 @@ -188,11 +179,12 @@ jobs: context: . platforms: linux/amd64,linux/arm64 push: true + file: ${{ matrix.file }} tags: | - ${{ steps.release-meta.outputs.is_prerelease == 'false' && format('{0}/astrbot:latest', env.DOCKER_HUB_USERNAME) || '' }} - ${{ steps.release-meta.outputs.is_prerelease == 'false' && env.HAS_GHCR_TOKEN == 'true' && format('ghcr.io/{0}/astrbot:latest', env.GHCR_OWNER) || '' }} - ${{ format('{0}/astrbot:{1}', env.DOCKER_HUB_USERNAME, steps.release-meta.outputs.version) }} - ${{ env.HAS_GHCR_TOKEN == 'true' && format('ghcr.io/{0}/astrbot:{1}', env.GHCR_OWNER, steps.release-meta.outputs.version) || '' }} + ${{ steps.release-meta.outputs.is_prerelease == 'false' && format('{0}/astrbot:latest{1}', env.DOCKER_HUB_USERNAME, matrix.tag_suffix) || '' }} + ${{ steps.release-meta.outputs.is_prerelease == 'false' && env.HAS_GHCR_TOKEN == 'true' && format('ghcr.io/{0}/astrbot:latest{1}', env.GHCR_OWNER, matrix.tag_suffix) || '' }} + ${{ format('{0}/astrbot:{1}{2}', env.DOCKER_HUB_USERNAME, steps.release-meta.outputs.version, matrix.tag_suffix) }} + ${{ env.HAS_GHCR_TOKEN == 'true' && format('ghcr.io/{0}/astrbot:{1}{2}', env.GHCR_OWNER, steps.release-meta.outputs.version, matrix.tag_suffix) || '' }} - name: Post build notifications run: echo "Release Docker image has been built and pushed successfully" diff --git a/Dockerfile.minimal b/Dockerfile.minimal new file mode 100644 index 0000000000..8388a08e02 --- /dev/null +++ b/Dockerfile.minimal @@ -0,0 +1,42 @@ +# Minimal Dockerfile for AstrBot +# Multi-stage: Build with uv; Run without node.js + +# Build stage +FROM python:3.12-slim AS builder + +WORKDIR /build + +# Install build dependencies +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc \ + build-essential \ + python3-dev \ + libffi-dev \ + libssl-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install uv and create virtual environment +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uv/bin/uv +COPY requirements.txt . +RUN /uv/bin/uv venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +# Install dependencies +RUN /uv/bin/uv pip install --no-cache -r requirements.txt socksio pilk + +# Runtime stage +FROM python:3.12-slim + +WORKDIR /AstrBot + +# Copy virtual environment from builder +COPY --from=builder /opt/venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +# Copy application code +COPY . /AstrBot/ + +EXPOSE 6185 + +CMD [ "python", "main.py" ]