使用 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