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

在AWS EKS的Jenkins Worker构建镜像遇Docker权限问题,该授权哪个用户?

问题描述

我已经在AWS EKS上部署了Jenkins,并指定了一个带有illumex.ai/noderole: jenkins-worker标签的节点用于运行Jenkins流水线任务。我想通过流水线构建Docker镜像,编写的流水线代码如下:

pipeline {
    agent {
        kubernetes {
            defaultContainer 'jnlp'
            yaml """
apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    illumex.ai/noderole: jenkins-worker
  containers:
  - name: docker
    image: docker:latest
    imagePullPolicy: Always
    command:
    - cat
    tty: true
    volumeMounts:
    - mountPath: /var/run/docker.sock
      name: docker-sock
  volumes:
  - name: docker-sock
    hostPath:
      path: /var/run/docker.sock
"""
        }
    }

    stages {
        stage('build') {
            steps {
                container('system') {
                        sh """
                        docker system prune -f
                        """
                }
            }
        }
    }
}

但任务执行失败,报错信息如下:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

我认为这是权限问题,但由于容器是由流水线动态创建的,我应该为哪个用户分配权限?


解决方案

这个问题我之前在EKS环境里踩过坑,核心确实是权限问题——你挂载的宿主节点上的/var/run/docker.sock文件有严格的权限控制,容器内的用户没有访问它的权限。下面一步步给你解决:

第一步:明确宿主节点的docker.sock权限

先登录到你的jenkins-worker节点,执行以下命令查看docker.sock的权限:

ls -l /var/run/docker.sock

正常输出会是这样:

srw-rw---- 1 root docker 0 Aug 10 12:00 /var/run/docker.sock

这里可以看到:docker.sock的读写权限属于root用户和docker组(默认组ID是999)。所以只要让容器内的用户属于这个组,或者以root用户运行容器,就能解决访问权限的问题。

第二步:修改流水线的Pod配置

针对权限问题,有两种可选方案,你可以根据安全性需求选择:

方案一:以root用户运行docker容器(简单直接)

在docker容器的配置中添加securityContext,指定以root用户(UID=0)启动容器:

containers:
- name: docker
  image: docker:latest
  imagePullPolicy: Always
  command:
  - cat
  tty: true
  volumeMounts:
  - mountPath: /var/run/docker.sock
    name: docker-sock
  securityContext:
    runAsUser: 0  # 以root用户运行容器,直接获得docker.sock的访问权限

方案二:将容器用户加入宿主的docker组(更安全)

如果不想用root用户,就通过supplementalGroups把容器内的用户加入到宿主的docker组(对应GID=999):

containers:
- name: docker
  image: docker:latest
  imagePullPolicy: Always
  command:
  - cat
  tty: true
  volumeMounts:
  - mountPath: /var/run/docker.sock
    name: docker-sock
  securityContext:
    supplementalGroups: [999]  # 让容器用户加入GID=999的组(对应宿主的docker组)

第三步:修正流水线里的容器名称错误

另外注意到你的流水线代码里,stage('build')步骤中指定的是container('system'),但你定义的容器名称是docker,这会导致Jenkins找不到对应的容器而报错,需要改成container('docker')。

完整修正后的流水线示例

pipeline {
    agent {
        kubernetes {
            defaultContainer 'jnlp'
            yaml """
apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    illumex.ai/noderole: jenkins-worker
  containers:
  - name: docker
    image: docker:latest
    imagePullPolicy: Always
    command:
    - cat
    tty: true
    volumeMounts:
    - mountPath: /var/run/docker.sock
      name: docker-sock
    securityContext:
      supplementalGroups: [999]  # 这里用方案二的配置,你也可以换成runAsUser:0
  volumes:
  - name: docker-sock
    hostPath:
      path: /var/run/docker.sock
"""
        }
    }

    stages {
        stage('build') {
            steps {
                container('docker') {
                        sh """
                        docker system prune -f
                        """
                }
            }
        }
    }
}

额外检查项

如果还是报错,可以确认以下两点:

  1. 你的jenkins-worker节点上Docker daemon是否正常运行,执行systemctl status docker检查状态;
  2. 检查EKS集群是否开启了Pod Security Policy(PSP)或者Pod Security Standards(PSS),如果有,需要确保策略允许你设置securityContext中的runAsUser或supplementalGroups。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:35:41