天机学堂day1:jenkins构建失败问题分析
一:
查看日志,所有 Job(tj-gateway、tj-auth …)在尝试启动构建时都抛出:
java.io.IOException: Permission denied at java.base/java.io.UnixFileSystem.createFileExclusively(Native Method) at java.base/java.io.File.createTempFile Caused: java.io.IOException: Failed to create a temporary file in /var/jenkins_home/jobs/<job-name>
Jenkins 启动时是以容器内的 jenkins 用户(uid=1000)运行,而宿主机 /var/jenkins_home 目录(挂载卷)的属主并不是 1000,导致容器内对该目录及其子目录没有写权限。典型场景:
-
目录在宿主机由 root 创建
-
目录在宿主机由其他用户创建
在 Jenkins 容器里执行:
# 进入容器 docker exec -it jenkins bash # 查看当前用户 whoami # → jenkins id # → uid=1000 gid=1000 # 测试写权限 touch /var/jenkins_home/test # → touch: cannot touch '/var/jenkins_home/test': Permission denied # 查看挂载目录权限 ls -ld /var/jenkins_home # → drwxr-xr-x 1 root root … /var/jenkins_home
解决步骤:
-
把宿主机目录的属主改成 1000:1000
sudo chown -R 1000:1000 /usr/local/src/jenkins
-
重启 Jenkins 容器
docker restart jenkins
二:
查看日志,原因有二:
-
Docker 命令未找到:
-
Jenkins 容器内部没有安装 Docker CLI。
-
宿主机的 Docker 可执行文件
/usr/bin/docker挂载到 Jenkins 容器后,容器内的 glibc 版本低于 Docker 所需的版本,导致无法运行。
-
-
权限问题:
-
Jenkins 容器没有以 root 用户身份运行,导致无法访问
/var/lib/apt/lists/partial目录,安装不了。
-
解决方法:
使用 Docker-in-Docker (DinD)。为了避免直接在 Jenkins 容器内部使用宿主机的 docker 命令,使用 Docker-in-Docker (DinD) 模式。这样可以在 Jenkins 容器内部运行一个独立的 Docker 守护进程,避免 glibc 版本不匹配的问题。
-
修改
docker-compose.yml文件,移除挂载/usr/bin/docker的部分,并添加 privileged 模式和用户权限:privileged: true user: root
-
重新启动 Jenkins 容器(不行的话可以删掉容器再运行
init.sh来创建容器):docker-compose down docker-compose up -d
-
在 Jenkins 容器内部安装 Docker CLI
进入 Jenkins 容器并安装 Docker CLI:
docker exec -it jenkins bash apt-get update && apt-get install -y docker.io
接下来就可以进行创建了。
更多推荐




所有评论(0)