docker - 使用 docker/build-push-action 在 GitHub Actions 中本地构建 docker 映像
问题描述
我的项目中有几个 Dockerfile。一种是用于构建basic
图像,其中包含一些业务级别的抽象。其他人正在基于basic
图像构建服务。
所以在我的服务的 Dockerfiles 我有类似的东西
FROM my-project/base
# Adding some custom logic around basic stuff
我使用 GitHub Actions 作为我的 CI/CD 工具。起初我有一个步骤将 docker 安装到我的工作人员中,然后运行类似:
- name: Build base image
working-directory: business
run: docker build -t my-project/base .
- name: Build and push service
working-directory: service
run: |
docker build -t my-ecr-repo/service .
docker push my-ecr-repo/service
但后来我找到了 docker/build-push-action 并决定在我的管道中使用它:
- name: Build business-layer container
uses: docker/build-push-action@v2
with:
load: true
tags: my-project/base
context: business
file: business/Dockerfile
- name: Build service
uses: docker/build-push-action@v2
with:
push: true
tags: my-ecr-repo/service
context: service
file: service/Dockerfile
至于现在,第二步尝试下载docker.io /my-project/base,显然做不到,因为我从不推送基础镜像:
ERROR: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
问题是: 构建映像的正确方法是什么,因此可以通过以下构建步骤在本地访问它?
PS:我不想把我的裸照推到basic
任何地方。
解决方案
我相信您需要同时设置load: true
基本图像和最终图像。这改变了使用本地 docker 引擎处理图像的行为。我相信如果你这样做,你将需要运行一个单独的推送,例如:
- name: Build business-layer container
uses: docker/build-push-action@v2
with:
load: true
tags: my-project/base
context: business
file: business/Dockerfile
- name: Build service
uses: docker/build-push-action@v2
with:
load: true
tags: my-ecr-repo/service
context: service
file: service/Dockerfile
- name: push service
run: |
docker push my-ecr-repo/service
另一种选择是使用本地注册表。这具有支持多平台构建的优势。但是你会想要从你的基础图像切换load
到push
,并且我会将基础图像作为构建参数传递,以使 Github 操作之外的用例更容易,例如:
jobs:
local-registry:
runs-on: ubuntu-latest
services:
registry:
image: registry:2
ports:
- 5000:5000
steps:
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# qemu should only be needed for multi-platform images
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
with:
driver-opts: network=host
- name: Build business-layer container
uses: docker/build-push-action@v2
with:
push: true
tags: localhost:5000/my-project/base
context: business
file: business/Dockerfile
- name: Build service
uses: docker/build-push-action@v2
with:
push: true
tags: my-ecr-repo/service
context: service
file: service/Dockerfile
build-args: |
BASE_IMAGE=localhost:5000/my-project/base
然后您的 Dockerfile 将允许将基本映像指定为构建参数:
ARG BASE_IMAGE=my-project/base
FROM ${BASE_IMAGE}
# ...
推荐阅读
- azure-cosmosdb - 查询 Cosmos 嵌套 JSON 文档
- intellij-idea - 如何在 Intellij 中清理 Play 项目
- elm - 使用 Elm Json.Decode 将 vales 从父记录移动到子记录
- c++ - C++ 中的隐式变量初始化
- ruby-on-rails - 成功平分后如何处理片状规格
- html - HTML 不同的焦点方向仅指向页面的一部分
- javascript - 从另一个组件访问 viewchild
- https - 如何在 ASP.NET Core 2.1 + Kestrel 中禁用 HTTPS?
- python - 将连接值传递给python中的zipfile方法
- python - Python 2.7 标准输入未将文本传递给管道