Github docker/build-push-action与多个架构是缓慢的

nvbavucw  于 11个月前  发布在  Docker
关注(0)|答案(1)|浏览(90)

我正在构建一个docker镜像,作为github actions中CD的一个步骤,我最近启用了多个架构构建,因为我使用的是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.

ukqbszuj

ukqbszuj1#

为多个架构构建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操作工作流中的并行度由strategy.matrix键决定。

解决github.repository_owner:

这就是如何运行shell脚本将用户名转换为一个MySQL 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 Actions中,GITHUB_ENV是一个特殊的环境文件。当您以NAME=VALUE向此文件写入字符串时。env上下文是GitHub Actions中可用的上下文,包含运行者可用的环境变量。当您写入GITHUB_ENV文件时,您设置的环境变量将添加到此上下文。

相关问题