Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用docker/Build push操作在GitHub操作中本地构建docker映像_Docker_Github Actions - Fatal编程技术网

使用docker/Build push操作在GitHub操作中本地构建docker映像

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

我的项目中有几个Dockerfiles。一个是用于构建
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
默认为driver
docker容器

这意味着默认情况下,构建将在容器中运行,因此在操作之外图像将不可用。
解决方案是将驱动程序设置为
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

     ...