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
相关产品推荐
相关产品推荐

