AWS EC2 Docker部署Jenkins运行管道时sudo/docker not found报错如何解决
错误根因
sudo not found报错:官方jenkins/jenkins:lts镜像默认未预装sudo工具,且容器内默认运行的jenkins用户无sudo权限,执行sudo命令直接失败。docker not found报错:- 原有Jenkins启动命令未挂载宿主机docker客户端二进制到容器内,容器内无docker可执行文件
- 最后一个构建阶段设置了
agent none,无可用执行环境调用docker命令 - 未挂载宿主机docker.sock到容器内,即使有docker命令也无法连接docker daemon
解决方案
第一步:调整Jenkins容器启动配置
先停止删除原有Jenkins容器:
docker stop jenkins-master && docker rm jenkins-master
使用新的启动命令运行容器:
sudo docker run --privileged --name jenkins-master \ -p 80:8080 -p 50000:50000 \ -v /var/jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker \ -u root \ -d jenkins/jenkins:lts
新增参数说明:
-v /var/run/docker.sock:/var/run/docker.sock:挂载宿主机docker daemon的通信套接字到容器内,让容器内的docker命令可以直接操作宿主机docker-v /usr/bin/docker:/usr/bin/docker:挂载宿主机docker客户端二进制到容器内,无需单独在容器内安装docker,版本和宿主机保持一致-u root:使用root用户运行容器内的Jenkins进程,直接规避docker.sock访问权限问题,无需额外执行权限修改命令
第二步:修正Jenkinsfile配置
移除冗余的权限修改阶段,修正阶段命名和agent配置,修改后内容如下:
pipeline { agent none stages { stage('Maven Build') { agent { docker { image 'maven:3-alpine' args '-v $HOME/.m2:/root/.m2' } } steps { sh 'mvn clean package -DskipTests' } } stage('Docker Image Build') { agent any steps { script { image = docker.build("image11") println "Newly generated image: " + image.id } } } } }
修改点说明:
- 删除了Docker Permissions阶段,使用root启动后无需再修改docker.sock权限
- 修正了重复的stage命名,避免执行冲突
- 最后一个构建阶段将
agent none改为agent any,指定在Jenkins master节点执行,可直接调用容器内预装的docker命令
可选:非root运行方案(安全要求更高的场景)
如果不希望用root用户运行Jenkins,可按如下方式调整:
- 先在宿主机执行命令获取docker组的gid:
getent group docker | cut -d: -f3,假设输出为999 - 启动命令移除
-u root参数,新增--group-add 999参数(将容器内的jenkins用户加入宿主机docker组,获得docker.sock访问权限)
内容的提问来源于stack exchange,提问作者miserable
相关产品推荐
相关产品推荐

