Github actions 运行器环境不为arm 镜像构建

Joh*_*boy 4 docker github-actions

我在 github 构建中遇到此错误:

请求的映像的平台 (linux/arm/v7) 与检测到的主机平台 (linux/amd64) 不匹配,并且未请求特定平台

我使用的运行程序环境是 ubuntu:latest,我的容器使用 arm32v7/node 基础映像。

这是我的 Dockerfile:

FROM arm32v7/node AS appbuild
WORKDIR /app
COPY package.json ./
COPY src/ ./src
RUN npm install

FROM appbuild as release
ENTRYPOINT ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)

这是我对 github yaml 的部署:

jobs:
  docker:
    runs-on: ubuntu-latest
Run Code Online (Sandbox Code Playgroud)

这些作业在 ubuntu 运行程序环境中运行。我怀疑我正在使用的节点映像的arm版本无法在该环境中运行,这是正确的吗?

编辑:

  - name: Build controller image
    if: steps.changed-files-plantcontroller.outputs.any_changed == 'true'
    run: >
      docker build -t ${{ env.image_name_controller }} ${{ env.context }}
    env:
      context: ./controller
Run Code Online (Sandbox Code Playgroud)

ten*_*ive 8

你是对的。如果没有 Docker Buildx,arm64 构建环境上的 Docker 无法构建 arm32v7 映像。您可以通过使用buildx Github Actionqemu action来解决此问题,这可以为您的环境做好构建多架构映像的准备。

Buildx 是 Docker 的技术,用于为与主机不匹配的目标架构构建映像(在本例中主机架构是arm64)。您可以在此处了解其工作原理。

QEMU是 Docker buildx 使用的模拟器。这是我在编写多架构工作流程时通过艰难的方式了解到需要的依赖项。

有关更多参考,请查看此文档:https://github.com/docker/build-push-action/blob/master/docs/advanced/multi-platform.md

您应该能够使用如下工作流程构建图像:

name: ci

on:
  push:
    branches:
      - 'master'

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v2
      -
        name: Set up QEMU dependency
        uses: docker/setup-qemu-action@v1
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Build controller image
        if: steps.changed-files-plantcontroller.outputs.any_changed == 'true'
        uses: docker/build-push-action@v2
        with:
          context: ${{ env.context }}
          tags: ${{ env.image_name_controller }}
          platforms: linux/arm/v7
          push: true
        env:
          context: ./controller
Run Code Online (Sandbox Code Playgroud)

注意:使用您Build controller image编写步骤的方式更新了最后一个构建命令。它只是将 Docker 命令转换为 Docker build-push-action 的构建方式。

您可以使用替代命令来代替build-push-action@v2

docker buildx build -t ${{ env.image_name_controller }} --platform linux/arm/v7 --push ${{ env.context }}
Run Code Online (Sandbox Code Playgroud)

该命令假设您想要使用该标签推送到 GitHub 存储库。


不相关,但有机会简化您的 Dockerfile。

当您使用 buildx 时,当您拉取的映像有多个版本时,Docker 可以处理拉取正确的 arm32v7 版本的映像。查看节点映像标签,您将看到linux/arm/v7列为 OS/Arch 标签之一。这意味着,如果您认为某个时候想要构建不同的架构,则可以简化您的FROM arm32v7/node AS appbuild生产线。FROM node AS appbuild

例如: