运行Jenkinsfile时出现docker.sock权限被拒绝报错如何解决
问题根本原因
报错是因为Jenkins运行用户无权限访问宿主机的Docker套接字文件/var/run/docker.sock,你尝试的sudo方案失败是因为Jenkins运行用户没有配置sudo免密权限,没有宿主机操作权限的前提下可以通过以下几种修改Jenkinsfile的方式解决:
方案1:容器启动时追加Docker组GID(推荐,无安全风险)
- 先临时添加一个阶段获取宿主机Docker组的GID,运行一次拿到结果后可以删除该阶段:
stage('查询Docker组GID') { sh 'getent group docker | cut -d: -f3' }
- 假设拿到的GID为
999,修改docker.inside的启动参数,追加--group-add 999即可:
node { docker.withRegistry("https://001.dkr.ecr.eu-west-1.amazonaws.com/my-tooling") { docker.image('my-tooling:deploy-agent_0.0.3') .inside("-v /var/lib/jenkins/.ivy2:/home/jenkins/.ivy2 --group-add 999", { // 原有业务逻辑 }) } }
原理是将宿主机Docker组的ID直接加入容器运行用户的附属组,容器内用户即可获得docker.sock的访问权限,不需要修改任何宿主机配置。
方案2:使用root用户启动容器(最简单)
如果安全规则允许容器内使用root用户运行,直接在启动参数中添加-u root即可:
docker.image('my-tooling:deploy-agent_0.0.3') .inside("-v /var/lib/jenkins/.ivy2:/home/jenkins/.ivy2 -u root", { // 原有业务逻辑 })
方案3:自定义镜像预置权限
如果你有权限修改my-tooling:deploy-agent镜像的Dockerfile,可以提前在镜像中预置对应GID的Docker组,并将jenkins用户加入组中:
# 假设宿主机Docker组GID为999 RUN groupadd -g 999 docker && usermod -aG docker jenkins
重新构建镜像后使用新镜像运行任务即可,无需每次在Jenkinsfile中追加参数。
内容的提问来源于stack exchange,提问作者Kaigo
相关产品推荐
相关产品推荐

