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

GitHub Actions构建Docker镜像本地与CI运行不一致问题排查

GitHub Actions构建Docker镜像本地运行触发非法指令问题

问题现象

  • 参照GitHub官方文档配置GitHub Actions工作流,自动构建C++ CMake项目(实现带INTERFACE库、SHARED库的DBSCAN点云聚类程序)的Docker镜像,推送至GitHub Container Registry。
  • 本地构建的Docker镜像运行完全正常,可正确输出程序帮助信息:
*************************************
*** DBSCAN Cluster Segmentation *** 
*************************************
--cloudfile: required.
Usage: program [options] 

Optional arguments:
-h --help           shows help message and exits [default: false]
-v --version        prints version information and exits [default: false]
--cloudfile         input cloud file [required]
--octree-res        octree resolution [default: 120]
--eps               epsilon value [default: 40]
--minPtsAux         minimum auxiliar points [default: 5]
--minPts            minimum points [default: 5]
-o --output-dir     output dir to save clusters [default: "-"]
--ext               cluster output extension [pcd, ply, txt, xyz] [default: "pcd"]
-d --display        display clusters in the pcl visualizer [default: false]
--cal-eps           calculate the value of epsilon with the distance to the nearest n points [default: false]
  • 工作流执行过程无报错,CI环境(ubuntu-latest运行器)中测试镜像可正常启动运行,但拉取GHCR上推送的最新镜像到本地运行时,程序直接崩溃,抛出Illegal Instruction (core dumped)错误。

使用的GitHub Actions工作流配置如下:

name: Demo Push

on:
  push:
    branches: ["test-github-packages"]
    tags:
      - v*
  pull_request:

env:
  IMAGE_NAME: dbscan-octrees

jobs:
  push:
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read

    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: Build image
        run: docker build --file Dockerfile --tag $IMAGE_NAME --label "runnumber=${GITHUB_RUN_ID}" .

      - name: Test image
        run: |
          docker run --rm \
          --env="DISPLAY" \
          --env="QT_X11_NO_MITSHM=1" \
          --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
          dbscan-octrees:latest

      - name: Log in to registry
        run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin

      - name: Push image
        run: |
          IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME
          IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
          VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
          [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
          [ "$VERSION" == "master" ] && VERSION=latest          
          echo IMAGE_ID=$IMAGE_ID
          echo VERSION=$VERSION
          docker tag $IMAGE_NAME $IMAGE_ID:latest
          docker push $IMAGE_ID:latest

排查过程

  • 先后排查编译错误、链接错误等常见问题,均未发现异常,最初怀疑问题与SHARED库的链接环节相关,但该假设无法解释「CI环境运行正常、本地拉取镜像运行失败」的差异。
  • 查阅GitHub Actions runner相关公开反馈,有用户提到该类问题可能与GitHub在容器安装阶段的修改行为有关。
  • 使用二进制对比工具分析CI构建的镜像内程序文件与本地正常编译的程序文件,发现CI构建出的二进制文件体积略大于本地版本。

问题根因

本地PC的CPU不支持AVX指令集,GitHub Actions运行器所用CPU支持AVX指令集,编译阶段默认启用了AVX相关指令生成,最终生成的二进制文件在不支持AVX指令集的本地设备上运行时,会触发非法指令错误。

解决方案

在CMake配置中添加对应编译标志,显式禁用AVX指令集支持,保证生成的二进制文件可在不支持AVX的CPU上正常运行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:01:21