Jenkins pipeline 部署docker通用模板

发布于:2025-07-19 ⋅ 阅读:(22) ⋅ 点赞:(0)

Jenkinsfile: 

 Docker的NETWORK_NAME不要使用bridge默认网络,要使用自定义的网络如test

  • 默认 bridge 网络:容器间不能用名字互相访问,只能用 IP。
  • 自定义网络:容器间可以用名字互相访问,Docker 自动做了 DNS 解析。
pipeline {
    agent any
    environment {
        // 定义镜像名称和标签作为环境变量
        IMAGE_NAME = 'my-application' 
        IMAGE_TAG = 'latest'
        CONTAINER_NAME = 'my-app-container'
        VOLUME_NAME = 'app-data-volume'
        NETWORK_NAME = 'test'  // 使用自定义网络名称
        HOST_PORT = '8080'
        CONTAINER_PORT = '8080'
    }
    
    stages {
        stage('检查运行中的容器') {
            steps {
                script {
                    // 检查容器是否存在并移除
                    try {
                        sh "docker container inspect ${CONTAINER_NAME}"
                        echo "容器 ${CONTAINER_NAME} 已存在。正在停止并移除..."
                        sh "docker container stop ${CONTAINER_NAME}"
                        sh "docker container rm ${CONTAINER_NAME}"
                    } catch (Exception e) {
                        echo "未找到名为 ${CONTAINER_NAME} 的容器。"
                    }
                    
                    // 检查镜像是否存在并移除
                    try {
                        sh "docker image inspect ${IMAGE_NAME}:${IMAGE_TAG}"
                        echo "镜像 ${IMAGE_NAME}:${IMAGE_TAG} 已存在。正在移除..."
                        sh "docker rmi ${IMAGE_NAME}:${IMAGE_TAG} -f"
                    } catch (Exception e) {
                        echo "未找到镜像 ${IMAGE_NAME}:${IMAGE_TAG}。"
                    }
                }
            }
        }
        
        stage('创建 Docker 卷') {
            steps {
                script {
                    // 检查卷是否存在,不存在则创建
                    try {
                        sh "docker volume inspect ${VOLUME_NAME}"
                        echo "卷 ${VOLUME_NAME} 已存在。"
                    } catch (Exception e) {
                        echo "正在创建卷 ${VOLUME_NAME}..."
                        sh "docker volume create ${VOLUME_NAME}"
                    }
                }
            }
        }
        
        stage('构建 Docker 镜像') {
            steps {
                script {
                    // 构建 Docker 镜像
                    echo "正在构建 Docker 镜像 ${IMAGE_NAME}:${IMAGE_TAG}..."
                    sh "docker build -t ${IMAGE_NAME}:${IMAGE_TAG} ."
                }
            }
        }
        
        stage('运行 Docker 容器') {
            steps {
                script {
                    // 运行 Docker 容器,挂载卷并映射端口
                    echo "正在启动容器 ${CONTAINER_NAME}..."
                    sh """
                        docker run -d \
                        --name ${CONTAINER_NAME} \
                        -p ${HOST_PORT}:${CONTAINER_PORT} \
                        -v ${VOLUME_NAME}:/app/data \
                        --network ${NETWORK_NAME} \
                        ${IMAGE_NAME}:${IMAGE_TAG}
                    """
                }
            }
        }
        
        stage('清理') {
            steps {
                script {
                    // 移除未使用的镜像
                    echo "正在清理未使用的 Docker 镜像..."
                    sh "docker image prune -f"
                }
            }
        }
    }
    
    post {
        success {
            echo "部署成功!"
            echo "应用程序可通过 http://<服务器IP>:${HOST_PORT} 访问"
        }
        failure {
            echo "部署失败!"
        }
        always {
            echo "流水线执行完成。"
        }
    }
}

Dockerfile: 

# 使用官方 Python 基础镜像(轻量级版本)
FROM python:3.10-slim

# 设置工作目录
WORKDIR /app

# 先复制依赖文件,以便利用 Docker 缓存层
COPY requirements.txt .

# 设置 pip 使用国内镜像源加速下载(可根据需要修改或删除)
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 安装依赖(使用 --no-cache-dir 减少镜像大小)
RUN pip install --no-cache-dir -r requirements.txt

# 复制项目所有文件(放在依赖安装之后,以便代码变更不影响依赖层缓存)
COPY . .

# 暴露应用端口(根据实际应用修改)
EXPOSE 8080

# 设置容器启动命令(根据实际应用修改)
CMD ["python", "app.py"]


网站公告

今日签到

点亮在社区的每一天
去签到