当前位置: 首页 > news >正文

Jenkins pipeline 部署docker通用模板

Jenkinsfile: 

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

  • 默认 bridge 网络:容器间不能用名字互相访问,只能用 IP。
  • 自定义网络:容器间可以用名字互相访问,Docker 自动做了 DNS 解析。
pipeline {agent anyenvironment {// 定义镜像名称和标签作为环境变量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"]

http://www.dtcms.com/a/285961.html

相关文章:

  • drm驱动学习(一)sunxi_drm初始化
  • 【leetcode】3201. 找出有效子序列的最大长度(1)
  • PyCharm 高效入门指南(核心模块详解二)
  • RoboBrain 2.0(具身智能论文阅读)
  • 笔试——Day12
  • 阿里云alicloud liunux3-安装docker
  • Python编程进阶知识之第二课学习网络爬虫(selenium)
  • JavaScript进阶篇——第九章 异常、this 与性能优化全解(终)
  • 14.链路聚合技术
  • 量化交易如何查询CFD指数实时行情
  • postman接口测试,1个参数有好几个值的时候如何测试比较简单快速?
  • IP协议深入理解
  • 20250718-4-Kubernetes 应用程序生命周期管理-Pod对象:实现机制_笔记
  • 如何保证缓存数据的一致性:数据库和缓存数据一致性,本地缓存和Redis缓存怎么保证数据一致性
  • Netty封装Websocket并实现动态路由
  • Spring Boot 应用优雅停机与资源清理:深入理解关闭钩子
  • 比特币技术简史 第四章:挖矿机制 - 挖矿算法、难度调整与矿池
  • 在ajax中什么时候需要将返回值类型做转换
  • Excel基础:格式化
  • 产品需求文档(PRD)格式全解析:从 RP 到 Word 的选择与实践
  • 2023 年 3 月青少年软编等考 C 语言八级真题解析
  • 回归预测 | MATLAB实现DBO-BP蜣螂算法优化BP神经网络多输入单输出回归预测
  • 借助AI学习开源代码git0.7之三git-init-db
  • MyBatis-Flex代码生成
  • ARINC818协议详解
  • KRaft 角色状态设计模式:从状态理解 Raft
  • 美创科技建设项目被评为中国信通院医疗领域“磐安”优秀案例
  • A33-vstar报错记录:ERROR: build kernel Failed
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十四天
  • (笔记+作业)第五期书生大模型实战营---L2G2000 GraphGen:训练数据合成实践