杂记 | 使用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.hqwc.cn/news/115515.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS滚动条详解(::-webkit-scrollbar )

滚动条出现的事件&#xff1a; 当设置定宽或者定高的元素添加overflow:scroll属性&#xff0c;会出现滚动条&#xff0c;但是原生样式的会比较丑影响美观。 <div class"content"><div class"contain"></div> </div>.content {wid…

坚鹏:中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期

中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期培训圆满结束 中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力&#xff0c;是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市&#xff0c;2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点…

Mybatis分页框架-PageHelper

Mybatis分页框架-PageHelper 一、PageHelper基础使用1.引入jar包2.配置conifg3.测试使用 二、PageHelper的多种用法1.使用PageHelper.startPage传入对象2.不使用PageHelper.startPage,而使用PageHelper.offsetPage3.使用Lambda进行分页4.不使用PageHelper直接分页5.想要使用分页…

Webpack使用plugin插件自动在打包目录生成html文件

我们使用html-webpack-plugin插件可以自动在打包代码目录生成html文件 使用步骤&#xff1a; 一、安装依赖 在控制台中输入如下代码&#xff1a; npm i -D html-webpack-plugin 二、在webpack.config.js中配置插件 const HTMLPlugin require("html-webpack-plugin&q…

华为云HECS安装docker

1、运行安装指令 yum install docker都选择y&#xff0c;直到安装成功 2、查看是否安装成功 运行版本查看指令&#xff0c;显示docker版本&#xff0c;证明安装成功 docker --version 或者 docker -v 3、启用并运行docker 3.1启用docker 指令 systemctl enable docker …

网络编程day05(IO多路复用)

今日任务&#xff1a; TCP多路复用的客户端、服务端&#xff1a; 服务端代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h> …

深度学习从入门到入土

1. 数据操作 N维数组样例 N维数组是机器学习和神经网络的主要数据结构 0-d 一个类别&#xff1a; 1.0 1-d 一个特征向量(一维矩阵)&#xff1a;[1.0, 2.7, 3.4] 2-d 一个样本-特征矩阵-(二维矩阵) 3-d RGB图片 &#xff08;宽x高x通道&#xff09;- 三维数组 4-d 一个RGB…

Apipost最佳实践

自诞生以来&#xff0c;Apipost凭借其简洁直观的用户界面、强大的功能以及简单、易上手的操作&#xff0c;让Apipost成为了开发人员不可或缺的工具。本文将详细介绍Apipost的主要功能和使用方法&#xff0c;帮助大家更好地了解这款优秀的API开发工具。 下载安装 直接进入Apip…

网络初识

一 IP 地址 概念: IP 地址主要用于表示网络主机、其他网络设备&#xff08;如路由器&#xff09;的网络地址。简单说&#xff0c;IP地址用于定位主机的网络地址 格式 IP 地址是一个32为的二进制数&#xff0c;通常被分割为4个“8位二进制数“&#xff08;也就是4个字节&…

在github上设置不同分支,方便回滚

在github上设置不同分支&#xff0c;方便回滚 步骤可能出现的问题couldnt find remote ref gpuVersion1. 确保您处于正确的分支2. 添加并提交更改&#xff08;如果还未进行&#xff09;3. 推送本地分支到远程仓库4. 验证操作 步骤 之前在github上上传了一个项目代码&#xff0c…

GitHub Copilot Chat

9月21日&#xff0c;GitHub在官网宣布&#xff0c;所有个人开发者可以使用GitHub Copilot Chat。用户通过文本问答方式就能生成、检查、分析各种代码。 据悉&#xff0c;GitHub Copilot Chat是基于OpenAI的GPT-4模型打造而成&#xff0c;整体使用方法与ChatGPT类似。例如&…

多模态 多引擎 超融合 新生态!2023亚信科技AntDB数据库8.0产品发布

9月20日&#xff0c;以“多模态 多引擎 超融合 新生态”为主题的亚信科技AntDB数据库8.0产品发布会成功举办&#xff0c;从技术和生态两个角度全方位展示了AntDB数据库第8次大型能力升级和生态建设成果。浙江移动、用友、麒麟软件、华录高诚、金云智联等行业伙伴及业界专家共同…