使用 GitHub Actions 的命名上下文

您可以定義額外的建構上下文 (additional build contexts),並透過 FROM name--from=name 在 Dockerfile 中存取它們。當 Dockerfile 定義了相同名稱的階段 (stage) 時,該階段將會被覆蓋。

這在 GitHub Actions 中非常有用,可用於重複使用其他建構的結果,或在工作流程中將映像檔固定到特定標籤。

將映像檔固定 (Pin) 到特定標籤

alpine:latest 替換為固定的版本

# syntax=docker/dockerfile:1
FROM alpine
RUN echo "Hello World"
name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Build
        uses: docker/build-push-action@v6
        with:
          build-contexts: |
            alpine=docker-image://alpine:3.21
          tags: myimage:latest

在後續步驟中使用映像檔

預設情況下,Docker Setup Buildx 動作會使用 docker-container 作為建構驅動程式 (build driver),因此建構出的 Docker 映像檔不會自動載入。

使用命名上下文,您可以重複使用已建構的映像檔

# syntax=docker/dockerfile:1
FROM alpine
RUN echo "Hello World"
name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          driver: docker

      - name: Build base image
        uses: docker/build-push-action@v6
        with:
          context: "{{defaultContext}}:base"
          load: true
          tags: my-base-image:latest

      - name: Build
        uses: docker/build-push-action@v6
        with:
          build-contexts: |
            alpine=docker-image://my-base-image:latest
          tags: myimage:latest

搭配容器建構器使用

如上一節所示,我們在執行命名上下文建構時並未使用預設的 docker-container 驅動程式。這是因為該驅動程式無法從 Docker store 載入映像檔,因為它是隔離的。為了解決此問題,您可以在工作流程中使用本機登錄庫 (local registry) 來推送您的基礎映像檔。

# syntax=docker/dockerfile:1
FROM alpine
RUN echo "Hello World"
name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    services:
      registry:
        image: registry:2
        ports:
          - 5000:5000
    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          # network=host driver-opt needed to push to local registry
          driver-opts: network=host

      - name: Build base image
        uses: docker/build-push-action@v6
        with:
          context: "{{defaultContext}}:base"
          tags: localhost:5000/my-base-image:latest
          push: true

      - name: Build
        uses: docker/build-push-action@v6
        with:
          build-contexts: |
            alpine=docker-image://:5000/my-base-image:latest
          tags: myimage:latest
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.