You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab Pipeline构建ARM架构镜像报错:exec /bin/sh格式错误

解决GitLab Pipeline跨架构构建Docker镜像的exec format error问题

问题根源

在amd64架构的GitLab Runner上构建arm64镜像时,Docker DinD环境默认未启用QEMU用户态模拟器,导致无法执行arm64架构的二进制文件(比如alpine镜像中的/bin/sh),从而抛出exec format error。而本地M2 Mac是arm64原生环境,无需模拟即可正常构建。

解决方案

1. 更新Dockerfile,明确指定架构

在FROM指令中添加--platform=linux/arm64,确保拉取arm64版本的基础镜像:

FROM --platform=linux/arm64 node:20.3.0-alpine3.18

RUN apk update
RUN apk add openssl

2. 修改GitLab CI脚本,启用QEMU模拟与多架构Buildx

在.gitlab-ci.yml的build脚本中,先注册QEMU模拟器,再创建支持多架构的Buildx builder:

image: node:20.3.0-alpine3.18

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: ""

stages:
  - build

build-container-dev:
  stage: build
  image: docker:23.0.5
  services:
    - docker:23.0.5-dind
  script:
    # 注册QEMU模拟器,为amd64机器提供arm64执行能力
    - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    # 创建并使用支持多架构的Buildx builder
    - docker buildx create --use --name multiarch-builder
    # 执行跨架构构建(如需推送到镜像仓库,添加--push参数)
    - docker buildx build -t testrepo:latest --platform linux/arm64 .

额外注意事项

  • 如果构建后需要推送到镜像仓库,务必在docker buildx build命令中添加--push参数,Buildx默认不会将跨架构构建的镜像加载到本地Docker daemon。
  • 确保GitLab Runner的机器具备足够权限(--privileged模式是注册QEMU的必要条件)。

内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:22:19