如何让树莓派4上的自托管GitHub Runner在Docker容器中运行任务
配置GitHub自托管Runner在Docker容器中执行任务
GitHub自托管Runner确实不像GitLab那样默认启用容器执行,但你可以通过两种方式实现任务在Docker中运行,彻底隔离宿主系统:
方案1:整个Job在Docker容器中运行
这种方式让整个Job的所有步骤都在指定的Docker容器内执行,是最彻底的宿主环境隔离方案。
修改你的Workflow配置
在现有build Job中添加container字段,指定适配树莓派arm64架构的镜像,并按需挂载硬件设备或宿主目录:
name: CI Rasp on: push: branches: [ "main" ] pull_request: branches: [ "main" ] workflow_dispatch: jobs: build: runs-on: self-hosted # 配置Job使用Docker容器 container: # 选择支持arm64的Python镜像(适配树莓派4) image: python:3.9-slim-bullseye # 特权模式+挂载GPIO设备,确保脚本能访问树莓派硬件 options: --privileged -v /dev/gpiomem:/dev/gpiomem -v /dev/mem:/dev/mem # 若需挂载宿主目录(比如你的blinky.py在宿主而非仓库),添加:-v /home/jbron:/workspace/scripts steps: - uses: actions/checkout@v3 # 安装脚本依赖(比如GPIO控制库) - name: 安装Python依赖 run: pip install RPi.GPIO - name: Run a one-line script run: echo Hello, world! # 若脚本在仓库中,直接运行;若在宿主挂载目录,用/workspace/scripts/blinky.py - name: Run blinky for 3 times run: python blinky.py
方案2:单步骤用Docker执行
如果只需要个别步骤在容器中运行,可直接在run步骤中调用docker run命令:
# 保留原Job结构,修改对应步骤 jobs: build: runs-on: self-hosted steps: - uses: actions/checkout@v3 - name: Run a one-line script run: echo Hello, world! - name: Run blinky in Docker container run: | docker run --rm --privileged \ -v $GITHUB_WORKSPACE:/workspace \ -v /dev/gpiomem:/dev/gpiomem \ python:3.9-slim-bullseye \ sh -c "cd /workspace && pip install RPi.GPIO && python blinky.py"
前置准备:树莓派上配置Docker环境
无论用哪种方案,都需要先在你的树莓派自托管Runner上安装Docker,并赋予Runner用户Docker权限:
- 安装Docker:
sudo apt update && sudo apt install docker.io -y
- 将Runner运行用户加入
docker组(避免每次执行Docker命令需sudo):
# 替换成你的Runner实际用户名,比如默认是github-runner sudo usermod -aG docker github-runner # 刷新组权限,或重启Runner服务 newgrp docker sudo systemctl restart github-runner.service
关键说明
- 镜像选择:必须使用支持arm64架构的镜像(树莓派4是arm64),避免用仅支持amd64的镜像导致运行失败。
- 硬件访问:若脚本需要控制GPIO等硬件,必须添加
--privileged参数并挂载对应设备文件(如/dev/gpiomem)。 - 脚本位置:推荐将
blinky.py放入代码仓库,这样通过actions/checkout就能同步到容器中,无需挂载宿主目录。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

