我有以下 Dockerfile
FROM --platform=$BUILDPLATFORM node:lts
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY index.js .
CMD ["node", "index.js"]
index.js 只是
console.log("Hello World");
我可以在 MacBook m3 中构建并运行该映像(
uname -m
打印arm64)
现在,我要做的是在 GitHub Actions 中构建图像并将其发布到 Github Package Registry 中。
我尝试过这个工作流程:
name: Create and publish a Docker image
on:
push:
branches: ['release']
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push-image:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
pages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build and push Docker image
id: push
uses: docker/build-push-action@v5
with:
platforms: linux/arm64
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
这会创建一个图像,但是当我拉动它并运行它时,我得到一个
exec /usr/local/bin/docker-entrypoint.sh: exec format error
。我过去遇到过这个错误,它通常表明用于构建映像的核心映像(来自初始 FROM 步骤的映像)与我们尝试运行它的拱门不匹配。但是当我do docker inspect
我可以检查架构是arm64。当我检查 GitHub Action 日志时,sha256 与节点中的多架构图像索引相匹配。
不确定我做错了什么,我所有的故障排除想法都没有达到任何效果T_T。
docker system prune -a
。我可以看到我正在拉动所有层,但运行时仍然失败。setup-buildx
之前尝试过使用 qemu,但我没有看到任何区别。我知道我不需要 qeru 为此(?)- name: Set up QEMU
uses: docker/setup-qemu-action@v3
编辑:设置
`FROM node@sha256:e256e6fb2dd3b003ea634a657f7da94bb34a98e599d7bcb99b5bec30a1343eae`
使其工作,这让我更加困惑,因为这与我在之前的 GitHub Actions 日志中看到的 sha256 相同。
你的形象被破坏了。 FROM 行指定
--platform=$BUILDPLATFORM
,这意味着无论映像的目标平台是什么,映像层中包含的二进制文件都将与构建平台架构相匹配。您需要从 Dockerfile 中删除它,以停止使用与文件系统层内容不匹配的平台构建映像。