jenkins使用docker方式编译项目
来源:原创
时间:2025-05-27
作者:脚本小站
分类:Jenkins
安装docker插件:
宿主机安装docker:
apt install docker.io -y
安装docker插件:
Docker plugin Docker Pipeline Docker API Plugin
pipeline流水线
构建java项目:
pipeline {
agent none
stages {
stage('Build Code') {
agent {
docker {
image 'maven:3.8.4-openjdk-17'
args '-v $HOME/.m2:/root/.m2'
label 'java'
}
}
steps {
sh 'cd mall-admin && mvn clean package'
}
post {
success {
stash name: 'mall-admin-target', includes: 'mall-admin/target/*.jar'
}
}
}
stage('Build Docker Image') {
agent {
docker {
image 'docker:dind' // 构建镜像阶段使用 Docker 镜像
args '-v /var/run/docker.sock:/var/run/docker.sock -u root' // 挂载 Docker 套接字
label 'java'
}
}
steps {
unstash 'target' // 恢复暂存的编译产物
script {
env.SHORT_COMMIT = env.GIT_COMMIT.substring(0, 7)
}
sh 'ls -al && ls -al target/'
sh "docker build -t harbor.k8s.local/mall-swarm/mall-admin:${env.SHORT_COMMIT}-${env.BUILD_ID} ."
sh "docker login --username admin --password Harbor12345 http://harbor.k8s.local"
sh "docker images"
sh "docker push harbor.k8s.local/mall-swarm/mall-admin:${env.SHORT_COMMIT}-${env.BUILD_ID}"
}
}
}
}方法二介绍:单 Agent 多容器(高效但复杂度高)在全局 Agent 中启动多个容器,通过 docker run 手动控制。
pipeline {
agent any
stages {
stage('Build Code') {
steps {
docker.image('maven:3.8.6-jdk-11').inside('-v $HOME/.m2:/root/.m2') {
sh 'mvn clean package'
}
}
}
stage('Build Docker Image') {
steps {
withDockerRegistry([url: "https://my-registry", credentialsId: "docker-creds"]) {
docker.withTool('docker') { // 使用 Jenkins 配置的 Docker 工具
sh '''
docker build -t my-app:${BUILD_ID} .
docker push my-app:${BUILD_ID}
'''
}
}
}
}
}
}构建npm项目:
pipeline {
agent none // 全局不指定,各阶段独立定义
stages {
stage('Docker Build') {
agent {
docker {
image 'node:18-alpine' // 使用官方Node镜像
args '-v $WORKSPACE:/app -w /app' // 挂载工作目录
label 'java'
}
}
steps {
sh 'npm install --registry=https://registry.npmmirror.com' // 安装依赖
sh 'npm run build' // 构建项目
sh 'ls -al' // 查看当前目录
// archiveArtifacts artifacts: 'dist/**' // 打包并上传构建产物
}
post {
success {
stash name: 'dist', includes: 'dist/**' // 打包成功后,将构建产物保存到stash中
}
}
}
stage('Build Docker Image') {
agent {
docker {
image 'docker:dind' // 构建镜像阶段使用 Docker 镜像
args '-v /var/run/docker.sock:/var/run/docker.sock -u root' // 挂载 Docker 套接字
label 'java'
}
}
steps {
unstash 'dist' // 从stash中恢复构建产物
script {
env.SHORT_COMMIT = env.GIT_COMMIT.substring(0, 7)
}
sh 'ls -al' // 查看当前目录
sh 'ls -al dist'
sh "docker build -t harbor.k8s.local/mall-swarm/mall-admin-web:${env.SHORT_COMMIT}-${env.BUILD_ID} ."
sh "docker login --username admin --password Harbor12345 http://harbor.k8s.local"
sh "docker images"
sh "docker push harbor.k8s.local/mall-swarm/mall-admin-web:${env.SHORT_COMMIT}-${env.BUILD_ID}"
}
}
}
}Dockerfile:
FROM nginx:stable-alpine # 复制构建产物到 Nginx 目录 COPY dist/ /usr/share/nginx/html # 暴露端口 EXPOSE 80 # 启动 Nginx CMD ["nginx", "-g", "daemon off;"]
Docker开启Remote API访问2375端口
方法一:
vim /etc/default/docker DOCKER_OPTS="-H tcp://0.0.0.0:2375" systemctl restart docker
方法二:推荐
vim /usr/lib/systemd/system/docker.service [Service] ExecStart= ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock --containerd=/run/containerd/containerd.sock # 彻底禁用 docker.socket systemctl disable docker.socket # 清除 systemd 的失败计数器 systemctl reset-failed docker.service # 删除残留的 Docker Socket 文件 rm -f /var/run/docker.sock systemctl daemon-reload systemctl restart docker
方法三:使用这种方法要删除/lib/systemd/system/docker.service文件中的 -H fd:// 参数,否则会冲突。
vim /etc/docker/daemon.json
{
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}测试:
# ps -ef|grep docker root 4839 1 0 10:47 ? 00:00:00 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock --containerd=/run/containerd/containerd.sock
常用命令:
docker -H tcp://0.0.0.0:2375 image ls REPOSITORY TAG IMAGE ID CREATED SIZE
