例如 Jenkins Home 目录为:

/opt/jenkins

容器内通常对应:

/var/jenkins_home

通过在 Jenkins Home 下新增 init.groovy.d 启动脚本来重置 admin 密码。


操作步骤

先确认 Jenkins 容器名称:

docker ps

查看 Jenkins Home 挂载目录:

docker inspect jenkins | grep -A 10 Mounts

假设你的宿主机目录是:

/opt/jenkins

那么后续操作都在该目录下完成。

  1. 停止 Jenkins 容器

docker stop jenkins

  1. 创建 init.groovy.d 目录

mkdir -p /opt/jenkins/init.groovy.d
  1. 创建密码重置脚本

创建文件:

vim /opt/jenkins/init.groovy.d/reset-admin-password.groovy

写入以下内容:

#!groovy

import jenkins.model.*
import hudson.security.*

def instance = Jenkins.get()

def hudsonRealm = instance.getSecurityRealm()

if (hudsonRealm instanceof HudsonPrivateSecurityRealm) {
    def user = hudsonRealm.getUser("admin")
    if (user != null) {
        user.addProperty(new HudsonPrivateSecurityRealm.Details("NewPassword123"))
        user.save()
        println("Admin password has been reset.")
    } else {
        hudsonRealm.createAccount("admin", "NewPassword123")
        println("Admin user has been created.")
    }
} else {
    println("Current security realm is not Jenkins local user database.")
}

instance.save()

NewPassword123改成你自己的密码

  1. 启动 Jenkins

docker start jenkins
  1. 使用新密码登录admin/NewPassword123


登录成功后删除脚本

很重要,登录确认成功后,删除重置脚本:

rm -f /opt/jenkins/init.groovy.d/reset-admin-password.groovy

然后重启 Jenkins:

docker restart jenkins

否则每次 Jenkins 启动时都会重新执行该脚本。


注意事项

  1. 该方法只适用于 Jenkins 内置用户数据库

如果 Jenkins 使用的是 LDAP、AD、OAuth、SSO 等外部认证方式,这个脚本可能不会生效。

可以临时关闭安全配置,或修改 Jenkins 的认证方式后再处理。

  1. 使用完一定要删除脚本

init.groovy.d 下的脚本会在 Jenkins 启动时执行。

因此重置完成后必须删除。


完整命令示例

假设 Jenkins 容器名为 jenkins,宿主机数据目录为 /opt/jenkins

docker stop jenkins

mkdir -p /opt/jenkins/init.groovy.d

cat > /opt/jenkins/init.groovy.d/reset-admin-password.groovy <<'EOF'
#!groovy

import jenkins.model.*
import hudson.security.*

def instance = Jenkins.get()

def hudsonRealm = instance.getSecurityRealm()

if (hudsonRealm instanceof HudsonPrivateSecurityRealm) {
    def user = hudsonRealm.getUser("admin")
    if (user != null) {
        user.addProperty(new HudsonPrivateSecurityRealm.Details("NewPassword123"))
        user.save()
        println("Admin password has been reset.")
    } else {
        hudsonRealm.createAccount("admin", "NewPassword123")
        println("Admin user has been created.")
    }
} else {
    println("Current security realm is not Jenkins local user database.")
}

instance.save()
EOF

docker start jenkins

登录成功后执行:

rm -f /opt/jenkins/init.groovy.d/reset-admin-password.groovy
docker restart jenkins