首页
/ Actions Runner Controller中Rootless Docker问题的分析与解决方案

Actions Runner Controller中Rootless Docker问题的分析与解决方案

2025-06-08 20:02:14作者:谭伦延

问题背景

在Kubernetes环境中使用Actions Runner Controller部署GitHub Actions自托管运行器时,用户经常需要支持Docker in Docker(DinD)功能。官方文档提供的Rootless Docker方案在实际部署中会出现容器启动失败的问题,特别是在GKE COS节点环境下。

问题现象

用户按照官方文档配置Rootless Docker后,dind容器无法正常启动,主要表现包括:

  1. 容器启动后立即退出
  2. 日志中显示iptables相关错误
  3. Docker守护进程无法正常初始化

根本原因分析

经过深入排查,发现问题的根源来自多个方面:

  1. Docker镜像版本兼容性问题:最新版的dind-rootless镜像与某些Kubernetes节点环境存在兼容性问题。

  2. Socket路径配置错误:文档中指定的默认socket路径unix:///var/run/docker.sock与Rootless Docker实际使用的路径不匹配。

  3. 系统环境差异:不同Kubernetes发行版(如GKE COS与Ubuntu)对Rootless容器的支持程度不同。

解决方案

1. 使用稳定版本的Docker镜像

将dind-rootless镜像固定到已知稳定的版本:

image: docker:24.0.6-dind-rootless

2. 调整Socket配置

移除硬编码的socket路径参数,让Docker自动选择基于UID的socket路径:

args:
  - dockerd

同时在runner容器中配置正确的环境变量:

env:
  - name: DOCKER_HOST
    value: unix:///run/user/1001/docker.sock

3. 完整的PodSpec配置

以下是经过验证可用的完整配置模板:

template:
  spec:
    volumes:
    - name: tmpdir
      emptyDir: {}
    - name: work
      emptyDir: {}
    - name: dind-externals
      emptyDir: {}
    - name: dind-sock
      emptyDir: {}
    - name: dind-etc
      emptyDir: {}
    - name: dind-home
      emptyDir: {}
    initContainers:
    - name: init-dind-externals
      image: ghcr.io/actions/actions-runner:latest
      command: ["cp", "-r", "-v", "/home/runner/externals/.", "/home/runner/tmpDir/"]
      volumeMounts:
        - name: dind-externals
          mountPath: /home/runner/tmpDir
    - name: init-dind-rootless
      image: docker:24.0.6-dind-rootless
      command:
        - sh
        - -c
        - |
          set -x
          cp -a /etc/. /dind-etc/
          echo 'runner:x:1001:1001:runner:/home/runner:/bin/ash' >> /dind-etc/passwd
          echo 'runner:x:1001:' >> /dind-etc/group
          echo 'runner:100000:65536' >> /dind-etc/subgid
          echo 'runner:100000:65536' >>  /dind-etc/subuid
          chmod 755 /dind-etc;
          chmod u=rwx,g=rx+s,o=rx /dind-home
          chown 1001:1001 /dind-home
      securityContext:
        runAsUser: 0
      volumeMounts:
        - mountPath: /dind-etc
          name: dind-etc
        - mountPath: /dind-home
          name: dind-home
    containers:
    - name: runner
      image: ghcr.io/actions/actions-runner:latest
      command: ["/home/runner/run.sh"]
      env:
        - name: DOCKER_HOST
          value: unix:///run/user/1001/docker.sock
      volumeMounts:
      - mountPath: /tmp
        name: tmpdir
      - name: work
        mountPath: /home/runner/_work
      - name: dind-sock
        mountPath: /var/run
    - name: dind
      image: docker:24.0.6-dind-rootless
      args:
        - dockerd
      securityContext:
        privileged: true
        runAsUser: 1001
        runAsGroup: 1001
      volumeMounts:
        - name: work
          mountPath: /home/runner/_work
        - name: dind-sock
          mountPath: /var/run
        - name: dind-externals
          mountPath: /home/runner/externals
        - name: dind-etc
          mountPath: /etc
        - name: dind-home
          mountPath: /home/runner

替代方案

对于使用RunnerDeployment而非RunnerScaleSet的用户,可以采用更简单的单容器方案:

command:
  - bash
  - -c
  - "mkdir -p /home/runner/.docker/docker /home/runner/.local/share && ln -s /home/runner/.docker/docker /home/runner/.local/share/docker && /bin/bash /usr/bin/entrypoint-dind-rootless.sh"
securityContext:
  privileged: true

环境适配建议

  1. GKE环境:如果使用COS节点遇到问题,可以尝试切换到Ubuntu节点镜像
  2. Kubernetes版本:确保使用较新的Kubernetes版本(如1.28+)
  3. 权限配置:仔细检查所有容器的securityContext配置,确保UID/GID一致

总结

Rootless Docker在安全性方面有明显优势,但配置相对复杂。通过合理选择Docker版本、正确配置socket路径和权限,可以在Actions Runner Controller中实现稳定可靠的DinD功能。对于不同环境,可能需要针对性地调整配置参数。

登录后查看全文
热门项目推荐

项目优选

收起
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
726
466
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
311
1.04 K
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
80
2
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.02 K
0
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
145
229
Dora-SSRDora-SSR
Dora SSR 是一款跨平台的游戏引擎,提供前沿或是具有探索性的游戏开发功能。它内置了Web IDE,提供了可以轻轻松松通过浏览器访问的快捷游戏开发环境,特别适合于在新兴市场如国产游戏掌机和其它移动电子设备上直接进行游戏开发和编程学习。
C++
31
5
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
117
253
WxJavaWxJava
微信开发 Java SDK,支持微信支付、开放平台、公众号、视频号、企业微信、小程序等的后端开发,记得关注公众号及时接受版本更新信息,以及加入微信群进行深入讨论
Java
814
22
csv4cjcsv4cj
一个支持csv文件的读写、解析的库
Cangjie
10
2
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
370
358