代码之家  ›  专栏  ›  技术社区  ›  Bailey Miller

使用多种架构的Github docker/build推送操作很慢

  •  0
  • Bailey Miller  · 技术社区  · 1 年前

    我正在构建一个docker镜像,作为我CD中github操作的一个步骤,我最近启用了多个架构构建,因为我在M2 Mac上,所以我也想要arm构建。我注意到,在启用后,我的构建时间飙升。

    我做错了什么吗?还是这是意料之中的事?

    步骤:

    # Build and push Docker image with Buildx (don't push on PR)
    # https://github.com/docker/build-push-action
    - name: Build and push Docker image
      id: build-and-push
      uses: docker/[email protected]
      with:
        context: ./src
        push: ${{ github.event_name != 'pull_request' }}
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}
        platforms: linux/amd64,linux/arm64
        cache-from: type=gha
        cache-to: type=gha,mode=max
    

    我还注意到,我现在看到了以下消息:

    #19 7.855 warning Pattern ["string-width@^4.1.0"] is trying to unpack in the same destination "/usr/local/share/.cache/yarn/v6/npm-string-width-cjs-4.2.3-269c7117d27b05ad2e536830a8ec895ef9c6d010-integrity/node_modules/string-width-cjs" as pattern ["string-width-cjs@npm:string-width@^4.2.0"]. This could result in non-deterministic behavior, skipping.
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   Jannik Sinz    1 年前

    为多个体系结构构建Docker镜像确实可以增加构建时间,尤其是当你在一台机器上进行构建时。这是因为Docker必须为每个架构构建一个单独的映像,这可能很耗时。

    当您为多个体系结构构建时,Docker使用QEMU来模拟目标体系结构。此模拟过程可能比本机构建慢,尤其是对于复杂的应用程序。

    如果增加的构建时间是一个问题,您可以考虑以下几个选项:

    • 并行构建:如果您可以访问多台机器,则可以并行构建不同体系结构的映像。

    • 使用buildx-bake:Docker的buildx工具有一个bake命令,可以并行地为多个平台构建图像,甚至在一台机器上。这可能会减少构建时间。

    • 使用基于云的构建服务:GitHub Actions确实支持并行性,但这取决于工作流的设置方式。如果你在一个作业中为多个架构构建Docker镜像,那么这些构建很可能是按顺序进行的,这可以解释构建时间增加的原因。

    为了利用GitHub Actions的并行性,您可以将构建拆分为单独的作业,并使用构建矩阵来指定不同的体系结构。以下是如何设置的示例:

    name: Build Docker Images
    
    on: [push, pull_request]
    
    jobs:
      build:
        runs-on: ubuntu-latest
        strategy:
          matrix:
            architecture: [amd64, arm64]
        steps:
        - uses: actions/checkout@v2
    
        - name: Set up Docker Buildx
          uses: docker/setup-buildx-action@v1
    
        - name: Build and push Docker image
          uses: docker/build-push-action@v2
          with:
            context: .
            push: true
            tags: user/app:${{ matrix.architecture }}
            platforms: linux/${{ matrix.architecture }}
    

    此GitHub Actions工作流中的并行度由 strategy.matrix 钥匙


    正在解决小写github.repository_owner:

    这就是运行shell脚本将用户名转换为小写env变量的方法。

    - name: Lowercase GitHub username
      run: echo "DOCKER_USERNAME=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV
    
    - name:
      ...
      tags: ${{ env.DOCKER_USERNAME }}/your-image-name:${{ steps.meta.outputs.tags }}
    

    在GitHub操作中 GITHUB_ENV 是一个特殊的环境文件。当您以以下格式向该文件写入字符串时 NAME=VALUE . env上下文是GitHub Actions中可用的上下文,其中包含运行程序可用的环境变量。当你写信给 GITHUB_ENV 文件中,您设置的环境变量将添加到此上下文中。

    推荐文章