使用 GitHub Actions 的命名上下文

你可定义 附加构建上下文, 并在 Dockerfile 中使用 FROM name--from=name 访问。当 Dockerfile 定义的阶段名称与之相同时,它将被覆盖。

这在使用 GitHub Actions 时很有用,可以重用其他构建的结果或将镜像固定到工作流中的特定标签。

将镜像固定到标签

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 设置 Buildx 操作使用 docker-container 作为构建驱动程序,因此构建的 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 仓库加载镜像,因为它处于隔离状态。为了解决这个问题,你可以在工作流中使用 本地注册表 来推送你的基础镜像:

# 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://localhost:5000/my-base-image:latest            
          tags: myimage:latest