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

GitHub Actions自托管Runner构建容器时Docker套接字权限拒绝问题

解决GitHub Actions自托管Runner容器构建时Docker套接字权限拒绝问题

核心原因

宿主机器的/var/run/docker.sock权限归属于宿主的docker用户组,而Runner容器内默认的runner用户组GID,与宿主docker组的GID不匹配——即便在容器内将runner加入本地docker组,也无法匹配宿主socket的权限规则,最终导致构建时权限拒绝。

解决方案

1. 启动容器时直接绑定宿主docker组GID

先在宿主机器查询docker组的GID:

getent group docker | cut -d: -f3

假设输出为999,修改Runner容器启动命令,添加--group-add参数绑定该GID:

docker run -it --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e GITHUB_OWNER=<xxx> \
  -e GITHUB_REPOSITORY=<xxxx> \
  -e GITHUB_PAT=<xxxx> \
  --group-add $(getent group docker | cut -d: -f3) \
  <你的GitHub Actions Runner镜像名称>

此方法无需修改镜像文件,直接让容器内的runner用户加入宿主的docker组。

2. 修改entrypoint.sh适配宿主docker组GID

如果需要镜像具备通用性,可在entrypoint.sh中添加权限适配逻辑:

# 在启动Runner前执行权限适配
if [ -n "$DOCKER_GID" ]; then
  # 调整容器内docker组的GID与宿主一致
  groupmod -g "$DOCKER_GID" docker 2>/dev/null || groupadd -g "$DOCKER_GID" docker
  # 将runner用户加入该组
  usermod -aG docker runner
fi

# 执行原Runner启动命令
exec ./run.sh "$@"

同时在Dockerfile中确保entrypoint.sh拥有执行权限:

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

启动容器时传入宿主docker组GID作为环境变量:

docker run -it --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e GITHUB_OWNER=<xxx> \
  -e GITHUB_REPOSITORY=<xxxx> \
  -e GITHUB_PAT=<xxxx> \
  -e DOCKER_GID=$(getent group docker | cut -d: -f3) \
  <你的GitHub Actions Runner镜像名称>

3. 临时调试方案(不推荐生产环境)

若需快速验证权限问题,可进入Runner容器直接修改socket权限:

# 进入运行中的Runner容器
docker exec -it <容器ID> bash
# 临时开放socket权限
chmod 666 /var/run/docker.sock

如果此时构建恢复正常,说明确实是组权限不匹配导致的问题,优先采用前两种方案彻底解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:55:44