一:

查看日志,所有 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

解决步骤:

  1. 把宿主机目录的属主改成 1000:1000

    sudo chown -R 1000:1000 /usr/local/src/jenkins
  2. 重启 Jenkins 容器

    docker restart jenkins

二:

查看日志,原因有二:

  1. Docker 命令未找到:

    • Jenkins 容器内部没有安装 Docker CLI。

    • 宿主机的 Docker 可执行文件 /usr/bin/docker 挂载到 Jenkins 容器后,容器内的 glibc 版本低于 Docker 所需的版本,导致无法运行。

  2. 权限问题:

    • Jenkins 容器没有以 root 用户身份运行,导致无法访问 /var/lib/apt/lists/partial 目录,安装不了。

解决方法:

使用 Docker-in-Docker (DinD)。为了避免直接在 Jenkins 容器内部使用宿主机的 docker 命令,使用 Docker-in-Docker (DinD) 模式。这样可以在 Jenkins 容器内部运行一个独立的 Docker 守护进程,避免 glibc 版本不匹配的问题。

  1. 修改 docker-compose.yml 文件,移除挂载 /usr/bin/docker 的部分,并添加 privileged 模式和用户权限:

    privileged: true 
    user: root
  2. 重新启动 Jenkins 容器(不行的话可以删掉容器再运行 init.sh 来创建容器):

    docker-compose down
    docker-compose up -d
  3. 在 Jenkins 容器内部安装 Docker CLI

    进入 Jenkins 容器并安装 Docker CLI:

    docker exec -it jenkins bash apt-get update && apt-get install -y docker.io

接下来就可以进行创建了。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐