为多个体系结构构建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
文件中,您设置的环境变量将添加到此上下文中。