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


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 && \  # 升级pip
    pip 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-alpine

WORKDIR /code

COPY . /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: fastapi
  CONTAINER_NAME: fastapi

# 在执行脚本前执行的命令
before_script:
  - pwd
  - ls
  - whoami
  - git --version
  - docker -v

# 构建阶段
build:
  stage: build
  script:
    - docker build -t $IMAGE_NAME .
  only:
    - main

# 部署阶段
deploy:
  stage: deploy
  script:
    - docker stop $CONTAINER_NAME || true  # 如果存在同名容器则先停掉
    - docker rm -f $CONTAINER_NAME || true
    - docker run -d --name $CONTAINER_NAME -p 80:8000 $IMAGE_NAME
  only:
    - main

# 脚本执行后执行的命令
after_script:
  - docker image prune -f  # 清除废弃的镜像
  - echo "--------DONE--------"  # 输出提示语句

05 项目结构

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

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

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

### 使用 Docker 部署 GitLab Runner 的指南 为了使用 Docker 容器化技术来部署 GitLab Runner,可以遵循一系列特定的操作流程。这不仅简化了环境设置过程,还提高了不同开发阶段的一致性可移植性。 #### 准备工作 确保本地机器上已经安装并配置好 Docker 环境。如果尚未完成此操作,则需先访问官方文档获取详细的安装指导[^2]。 #### 下载 GitLab Runner 镜像 通过执行如下命令下载最新的 GitLab Runner Docker 镜像: ```bash docker pull gitlab/gitlab-runner:latest ``` #### 创建专用网络 (推荐) 为提高容器间通信的安全性效率,建议创建一个新的自定义桥接网络用于 GitLab 其关联服务之间的交互: ```bash docker network create gitlab-network ``` #### 启动 GitLab Runner 容器实例 启动 GitLab Runner 实例时指定必要的参数以实现最佳性能功能支持。下面是一个典型的 `docker run` 命令示例,其中包含了注册 token (`REGISTRATION_TOKEN`) 及其他重要选项: ```bash docker run -d --name gitlab-runner \ --network gitlab-network \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest ``` 这里 `-v` 参数用来挂载主机上的路径至容器内部;特别是 `/var/run/docker.sock` 文件映射允许 GitLab Runner 访问宿主机的 Docker Daemon 进而构建项目镜像。 #### 注册 GitLab Runner 到 CI/CD 流水线 一旦容器成功运行起来之后,就需要将其注册到目标 GitLab 实例中去参与持续集成管道的工作。可以通过向上述创建好的容器发送 HTTP 请求或者直接进入容器内部执行注册脚本来达成目的。具体做法取决于所使用GitLab 版本个人偏好。 对于基于 Web UI 方式的注册方法,请参照官方手册中的说明进行操作[^3]。 #### 自动化配置 Maven 私服连接 当涉及到 Java 或者 Kotlin 类型的应用程序时,在 `.gitlab-ci.yml` 中添加适当的前置指令能够帮助自动复制预设好的 `settings.xml` 至默认位置从而顺利完成依赖解析任务。 ```yaml before_script: - mkdir -p ~/.m2 - cp .mvn/conf/settings.xml ~/.m2/ ``` 以上步骤展示了如何利用 Docker 技术快速搭建起一个可用的 GitLab Runner 并使其参与到自动化测试与发布过程中来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿林仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值