使用 GitHub Actions 新增 SBOM 和來源證明

軟體物料清單 (SBOM) 和來源證明添加了有關映象內容及其構建方式的元資料。

docker/build-push-action 的版本 4 及更高版本支援證明。

預設來源

docker/build-push-action GitHub Action 會在以下條件下自動將來源證明新增到你的映象中:

  • 如果 GitHub 倉庫是公開的,則會自動將帶有 mode=max 的來源證明新增到映象中。
  • 如果 GitHub 倉庫是私有的,則會自動將帶有 mode=min 的來源證明新增到映象中。
  • 如果你正在使用 docker 匯出器,或者你正在使用 load: true 將構建結果載入到執行器,則不會向映象新增任何證明。這些輸出格式不支援證明。
警告

如果你正在使用 docker/build-push-action 為公共 GitHub 倉庫中的程式碼構建映象,則預設附加到映象的來源證明將包含構建引數的值。如果你濫用構建引數來將秘密(例如使用者憑據或身份驗證令牌)傳遞給構建,則這些秘密將暴露在來源證明中。請重構你的構建以使用秘密掛載來傳遞這些秘密。同時,請記住輪換你可能已暴露的任何秘密。

最大級別來源

建議你使用最大級別來源證明構建映象。私有倉庫預設只新增最小級別來源,但你可以透過將 docker/build-push-action GitHub Action 上的 provenance 輸入設定為 mode=max 來手動覆蓋來源級別。

請注意,向映象新增證明意味著你必須直接將映象推送到登錄檔,而不是將映象載入到執行器的本地映象儲存中。這是因為本地映象儲存不支援載入帶有證明的映象。

name: ci

on:
  push:

env:
  IMAGE_NAME: user/app

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ vars.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.IMAGE_NAME }}

      - name: Build and push image
        uses: docker/build-push-action@v6
        with:
          push: true
          provenance: mode=max
          tags: ${{ steps.meta.outputs.tags }}

SBOM

SBOM 證明不會自動新增到映象中。要新增 SBOM 證明,請將 docker/build-push-actionsbom 輸入設定為 true。

請注意,向映象新增證明意味著你必須直接將映象推送到登錄檔,而不是將映象載入到執行器的本地映象儲存中。這是因為本地映象儲存不支援載入帶有證明的映象。

name: ci

on:
  push:

env:
  IMAGE_NAME: user/app

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ vars.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.IMAGE_NAME }}

      - name: Build and push image
        uses: docker/build-push-action@v6
        with:
          sbom: true
          push: true
          tags: ${{ steps.meta.outputs.tags }}