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

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

2025-06-08 22:28:16作者:谭伦延

问题背景

在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功能。对于不同环境,可能需要针对性地调整配置参数。

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