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 Setup Buildx action 使用 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://:5000/my-base-image:latest
tags: myimage:latest