在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 """ } } } } }
额外检查项
如果还是报错,可以确认以下两点:
- 你的
jenkins-worker节点上Docker daemon是否正常运行,执行systemctl status docker检查状态; - 检查EKS集群是否开启了Pod Security Policy(PSP)或者Pod Security Standards(PSS),如果有,需要确保策略允许你设置
securityContext中的runAsUser或supplementalGroups。
内容的提问来源于stack exchange,提问作者Shkolar

