使用 Docker 部署的 Jenkins 如何打包其他 Docker 镜像
Jenkins 打包其他 Docker 镜像的常见方法包括:直接安装 Docker 引擎(Docker-in-Docker 或 DooD)、使用 Docker 命令行工具连接宿主机 Docker(DooD变种)、或通过 Jenkins Slave 节点预装 Docker。 最常见且推荐的方式是让 Jenkins Slave(构建节点)安装 Docker,并配置权限,或者使用 Docker-in-Docker (DinD) 容器化运行构建。
在运行 Jenkins Agent(从节点)的机器上安装 Docker 守护进程 (dockerd)。
Jenkins Pipeline 通过 SSH 或直接运行 docker build 命令来使用宿主机的 Docker 引擎。
需要确保 Jenkins 用户(如jenkins或hudson)有权限访问 Docker Socket (/var/run/docker。sock),通常通过将其加入 docker 用户组实现。
Jenkins Slave 本身作为一个 Docker 容器启动 (docker run –privileged … jenkins/agent),并在该容器内部再运行一个Docker守护进程。
Pipeline 脚本中直接使用 docker build,实际上是在容器内部的 Docker 环境执行。
优点是环境隔离好,缺点是需要 –privileged 权限且可能存在存储/缓存问题。
Jenkins Slave 容器挂载宿主机的 /var/run/docker.sock。
Pipeline 中的 docker 命令实际上是在操作宿主机的 Docker 引擎。
这种方式比较轻量,但权限管理和路径映射需要更小心。
Jenkins Slave 连接到配置了 TCP 监听的远程 Docker 守护进程。
不安全,不建议用于生产环境。
pipeline {
agent { label 'docker-node' } // 标签指向安装了Docker的Slave节点
stages {
stage('Build Image') {
steps {
script {
sh 'docker build -t my-app:${BUILD_NUMBER} 。'
sh 'docker tag my-app:${BUILD_NUMBER} my-app:latest'
}
}
}
stage('Push Image') {
steps {
script {
docker。withRegistry('https://registry。hub。docker。com', 'docker-hub-credentials-id') {
sh 'docker push my-app:${BUILD_NUMBER}'
sh 'docker push my-app:latest'
}
}
}
}
}
}