杂记 | 使用gitlab-runner将python项目以docker镜像方式流水线部署到服务器(解决部署缓慢和时区不对的问题)

文章目录

  • 01 需求背景
    • 1.1 需求
    • 1.2 步骤
  • 02 编写BaseDockerfile
    • 2.1 编写
    • 2.2 说明
    • 2.3 执行
  • 03 编写Dockerfile
  • 04 编写.gitlab-ci.yml
  • 05 项目结构


01 需求背景

1.1 需求

我有一个python项目,该项目可能是一个服务器监控程序,也可能是一个后端程序,现在需要将该项目以流水线方式部署到服务器端,使用docker的方式实现。需要解决几个问题:

  1. Dockerfile如何写?
  2. .gitlab-ci.yml如何写?
  3. 如何避免每次部署耗费很长时间的问题?
  4. 如何设置容器内的时间与本地时间一致?

1.2 步骤

本文以FastAPI的python后端服务项目为例进行演示。

步骤如下:

  • 编写BaseDockerfile文件
  • 编写Dockerfile文件
  • 编写.gitlab-ci.yml文件

验证流水线

02 编写BaseDockerfile

2.1 编写

首先,需要编写BaseDockerfile,该文件用于构建基础镜像,这是解决每次部署慢问题的关键,因为如果每次从头构建镜像,必然会消耗大量时间,而如果我们在一开始先把基础镜像构建好,每次部署的时间就大大缩短了。

新建一个名为BaseDockerfile的文件,写入下述内容:

# 如果该项目的requirements.txt被更新 请修改下方RUN命令最后一行 更新相关内容 并重新构建基础镜像
FROM python:3.11.5-alpine  # 这里选择基于alpine的镜像作为基础镜像 体积小巧# 构建镜像时要执行的命令
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \  # apk换源apk --no-cache upgrade && \  # 升级插件apk add --no-cache tzdata && \  # 安装时区设置工具pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \  # pip换源pip install --no-cache-dir --upgrade pip && \  # 升级pippip install --no-cache-dir fastapi uvicorn[standard]  # 这里写要安装的基础python库# 环境变量设置时区 与本地时区一致
ENV TZ=Asia/Shanghai

2.2 说明

  1. 上述命令中,使用--no-cache--no-cache-dir的写法主要是为了避免缓存,减小构建包的大小。

  2. 如果涉及构建失败,可能是因为缺少相关环境所致,可以将安装时区工具那行进行修改,修改示例:

    # 修改前
    apk add --no-cache tzdata && \
    # 修改后
    apk add --no-cache musl-dev linux-headers g++ tzdata && \
    
  3. 仅使用一个RUN命令,多个RUN命令会进行嵌套构建,增加体积。

2.3 执行

使用时,将该文件重命名为Dockerfile后在linux中同目录下执行以下命令:

docker build -t <镜像名称>:<镜像标签> .
# 例如
docker build -t python_fastapi:3.11.5-alpine .

查看构建好的基础镜像:

docker images

03 编写Dockerfile

新建一个文件,命名为Dockerfile,写入如下内容:

# 使用刚才提前构建好的基础镜像
FROM python_fastapi:3.11.5-alpineWORKDIR /codeCOPY . /code# 执行pip安装命令,其中的依赖库已在构建基础镜像时安装,这里不会重复安装。
RUN pip install -r /code/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/# 设置容器启动时的命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

构建镜像:

docker build -t <镜像名> .
# 例如
docker build -t fastapi .

启动容器:

docker run -d --name <容器名> -p <主机端口>:<容器端口> <镜像名>
# 例如
docker run -d --name fastapi -p 80:8000 fastapi

04 编写.gitlab-ci.yml

最后是编写.gitlab-ci.yml文件。
一个简单的参考示例:

# 两个阶段 - 构建, 部署
stages:- build- deploy# 设置环境变量 - 镜像名, 容器名,下方会用到,python程序执行过程中也能访问到
variables:IMAGE_NAME: fastapiCONTAINER_NAME: fastapi# 在执行脚本前执行的命令
before_script:- pwd- ls- whoami- git --version- docker -v# 构建阶段
build:stage: buildscript:- docker build -t $IMAGE_NAME .only:- main# 部署阶段
deploy:stage: deployscript:- docker stop $CONTAINER_NAME || true  # 如果存在同名容器则先停掉- docker rm -f $CONTAINER_NAME || true- docker run -d --name $CONTAINER_NAME -p 80:8000 $IMAGE_NAMEonly:- main# 脚本执行后执行的命令
after_script:- docker image prune -f  # 清除废弃的镜像- echo "--------DONE--------"  # 输出提示语句

05 项目结构

至此,整体的项目结构如下所示:

|-- demo|-- xxxxx.py  # 项目本身的代码|-- .gitlab-ci.yml|-- BaseDockerfile|-- Dockerfile|-- requirements.txt

这样,每次将代码推送到远端,就可以实现流水线自动部署了。
每次部署的耗时从之前的10分钟缩短到20秒以内:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/139746.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGLM GPT原理介绍

图解GPT 除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。 OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/) 能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Transformer搭建的,相…

使用 PyTorch 的计算机视觉简介 (1/6)

一、说明 Computer Vision&#xff08;CV&#xff09;是一个研究计算机如何从数字图像和/或视频中获得一定程度的理解的领域。理解这个定义具有相当广泛的含义 - 它可以从能够区分图片上的猫和狗&#xff0c;到更复杂的任务&#xff0c;例如用自然语言描述图像。 二、CV常见的问…

Python类练习

文章目录 题目要求步骤 题目要求 1)创建一个 Kid 类&#xff0c;包含姓名&#xff0c;性别&#xff0c;年龄属性和 play 方法 2) 创建一个 Stu 类&#xff0c;继承 Kid 类&#xff0c;同时包含成绩属性&#xff0c;获取成绩方法&#xff0c;努力学习方法&#xff0c;play方法&…

Java笔记:看清类加载过程

1 类加载的过程 1.1 加载 “加载”是“类加载”(Class Loading)过程的第一步。这个加载过程主要就是靠类器实现的&#xff0c;包括用户自定义类加载器。 加载的过程 在加载的过程中&#xff0c;JVM主要做3件事情 1&#xff09;通过一个类的全限定名来获取定义此类的二进制字节…

Latex Overleaf 写作问题记录

Latex & Overleaf 写作问题记录 公式换行及排列整齐 \begin{equation} \begin{split}Y & a1\\&b2 \end{split} \end{equation}顶格 \noindent求和符号 求和符号&#xff08;上下限上下排列&#xff09; \sum\limlits求和符号&#xff08;上下限右边排列&#…

一键集成prometheus监控微服务接口平均响应时长

一、效果展示 二、环境准备 prometheus + grafana环境 参考博文:https://blog.csdn.net/luckywuxn/article/details/129475991 三、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter

《Playing repeated games with Large Language Models》全文翻译

《Playing repeated games with Large Language Models》- 使用大型语言模型玩重复游戏 论文信息摘要1. 介绍2. 相关工作3. 一般方法4. 分析不同游戏系列的行为5. 囚徒困境5.1 性别之战 6. 讨论 论文信息 题目&#xff1a;《Playing repeated games with Large Language Model…

QT:使用堆叠窗口、标签、下拉条

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QStackedWidget> //堆叠窗口 #include <QComboBox> //下拉条 #include <QLabel> //标签class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *p…

JavaScript的Web Worker

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript的Web Worker⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量…

算法通过村第七关-树(递归/二叉树遍历)白银笔记|递归实战

文章目录 前言1. 深入理解前中后序遍历从小到大递推分情况讨论&#xff0c;明确结束条件组合出完整的方法&#xff1a;从大到小 画图推演 总结 前言 提示&#xff1a;没有客观公正的记忆这回事&#xff0c;所有的记忆都是偏见&#xff0c;都是为自己的存活而重组过的经验。--国…

pytest简明教程

1. 简介 pytest是一款基于Python的测试框架。与Python自带的unittest相比&#xff0c;pytes语法更加简洁&#xff0c;断言更加强大&#xff0c;并且在自动测试以及插件生态上比unittest都要更加强大。 1.1. 安装pytest pip install pytest1.2. pytest命名规则 pytest默认会…

【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现【更新中】

【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现 本文介绍基于libsvm代理模型算法的特征排序方法合集&#xff0c;包括&#xff1a; 1.sing 2.adaboost 3.corr 4.svmrfe_ker 5.svmrfe_ori 1.sing 十折交叉取平均错误率值 累计贡…

UOS Deepin Linux 安装 anaconda

UOS Deepin Linux 安装 anaconda 下载 anaconda 官网下载 国内开源镜像站下载 官网下载 anaconda 官网&#xff1a; https://www.anaconda.com/ 点击右上角 Free Download 按钮 跳转值下载页面&#xff1a;https://www.anaconda.com/download 国内开源镜像站下载 清华大学开源…

【C++】STL详解(七)—— stack和queue的使用及模拟实现

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C学习 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C】STL…

跨域问题解决方案(三种)

Same Origin Policy同源策略&#xff08;SOP&#xff09; 具有相同的Origin&#xff0c;也即是拥有相同的协议、主机地址以及端口。一旦这三项数据中有一项不同&#xff0c;那么该资源就将被认为是从不同的Origin得来的&#xff0c;进而不被允许访问。 Cross-origin resource…

strtok()函数的使用方法

strtok() 函数用于将字符串分割成子字符串&#xff08;标记&#xff09;。它在 C 语言中非常常用&#xff0c;可以通过指定分隔符来拆分原始字符串&#xff0c;并依次返回每个子字符串。 以下是 strtok() 函数的使用方法&#xff1a; #include <stdio.h> #include <…

JUC第七讲:关键字final详解

JUC第七讲&#xff1a;关键字final详解 final 关键字看上去简单&#xff0c;但是真正深入理解的人可以说少之又少。本文是JUC第七讲&#xff1a;关键字final详解&#xff0c;将常规的用法简化&#xff0c;提出一些用法和深入的思考。 文章目录 JUC第七讲&#xff1a;关键字fina…

光伏发电系统最大功率跟踪控制MATLAB仿真模型(电导增量法+扰动观察法)

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型介绍&#xff1a; 模型主要包含光伏电池模块、直流升压模块、以及最大功率跟踪控制模块。 扰动观察法&#xff08; P&O &#xff09;&#xff1a; 所谓 P&O 就是每过一会给予系统工作电压一个可…

【C++】C++11——可变参数模板和emplace

可变参数模板的定义方式可变参数模板的传值计算可变参数模板参数个数参数包展开方式递归展开参数包逗号表达式展开参数包 emplace插入 可变参数模板是C11新增的最强大的特性之一&#xff0c;它对参数高度泛化&#xff0c;能够让我们创建可以接受可变参数的函数模板和类模板。 在…

【Less-CSS】初识Less,使编写 CSS 变得简洁

初识Less&#xff0c;使编写 CSS 变得简洁 1.Less简述2.LESS 原理及使用方式3.示例4.less语法5.Easy Less插件 作为一门标记性语言&#xff0c;CSS 的语法相对简单&#xff0c;对使用者的要求较低&#xff0c;但同时也带来一些问题&#xff1a;CSS 需要书写大量看似没有逻辑的代…