使用docker/Build push操作在GitHub操作中本地构建docker映像
我的项目中有几个Dockerfiles。一个是用于构建使用docker/Build push操作在GitHub操作中本地构建docker映像,docker,github-actions,Docker,Github Actions,我的项目中有几个Dockerfiles。一个是用于构建basicimage,其中包含一些业务级抽象。其他的是建筑服务,基于basic图像 所以在我的服务文档中我有 FROM my-project/base # Adding some custom logic around basic stuff 我正在使用GitHub操作作为我的CI/CD工具。 起初,我有一个步骤将docker安装到我的工作人员中,然后运行如下操作: - name: Build base image working-di
basic
image,其中包含一些业务级抽象。其他的是建筑服务,基于basic
图像
所以在我的服务文档中我有
FROM my-project/base
# Adding some custom logic around basic stuff
我正在使用GitHub操作作为我的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推送操作,并决定在我的管道中使用它:
- 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,但显然无法完成,因为我从未推送base image:
ERROR: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
问题是:
构建映像的正确方法是什么,以便通过以下本地构建步骤访问映像?
附言:
我不想把我的裸体
basic
图像推到任何地方。在构建过程中使用本地图像没有特殊步骤。Docker总是在进入注册表之前检查您在本地拥有的内容。如果你在一个会话中完成了这两个步骤,并且没有在某个地方输入错误,那么它就是有效的
现在,如果没有,问题只剩下两个可能的来源:要么是构建这些图像的环境,要么是使用的操作。试着在ubuntu最新版本上运行,看看是否有什么变化来消除第一个版本
我还可以为您提供两种解决方案,但您可能不会同时喜欢这两种方案:
1。使用临时本地注册表。我在您使用的操作页面上找到了此指南,并对您的代码稍作修改:
作业:
本地注册处:
运行于:ubuntu最新版本
服务:
注册处:
图像:注册表:2
端口:
- 5000:5000
步骤:
-
名称:成立QEMU
用途:docker/setup qemu-action@v2
-
名称:设置Docker Buildx
用途:docker/setup buildx-action@v1
与:
驱动程序选项:网络=主机
-
名称:构建业务层容器
用途:docker/build push-action@v2
与:
负载:真
标记:localhost:5000/my project/base
背景:商业
文件:business/Dockerfile
-
名称:生成服务
用途:docker/build push-action@v2
与:
推送:对
标签:我的ecr回购/服务
上下文:服务
文件:service/Dockerfile
当然,您必须更新服务/Dockerfile
以指向localhost:5000/my project/base
,而不仅仅是my project/base
2。使用简单的shell而不是构建推送操作。如果您的旧代码正常工作,而该操作不正常,那么问题很可能就出在操作中。我相信您需要在基本映像和最终映像中设置
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}
# ...
github操作
docker/setup buildx-action@v1
默认为driverdocker容器
这意味着默认情况下,构建将在容器中运行,因此在操作之外图像将不可用。
解决方案是将驱动程序设置为
docker
:
...
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
with:
driver: docker # defaults to "docker-containerized"
- name: Build business-layer container
uses: docker/build-push-action@v2
with:
# using "load: true" forces the docker driver
# not necessary here, because we set it before
#load: true
tags: my-project/base:latest
context: business
file: business/Dockerfile
- name: Build service
uses: docker/build-push-action@v2
with:
# using "push: true" will lead to error:
# Error: buildx call failed with: auto-push is currently not implemented for docker driver
# so you will have to follow the solution outlined here:
# https://github.com/docker/build-push-action/issues/100#issuecomment-715352826
# and push the image manually following the build
#push: true
tags: my-ecr-repo/service:latest
context: service
file: service/Dockerfile
# list all images, you will see my-ecr-repo/service and my-project/base
- name: Look up images
run: docker image ls
# push the image manually, see above comment
- name: Push image
run: docker push my-ecr-repo/service:latest
...