Notes diverses | Utilisez gitlab-runner pour déployer des projets Python sur le serveur dans un pipeline d'images Docker (résoudre les problèmes de déploiement lent et de fuseaux horaires incorrects)


01 Contexte de la demande

1.1 Exigences

J'ai un projet Python, qui peut être un programme de surveillance de serveur ou un programme back-end. Je dois maintenant déployer le projet sur le serveur de manière pipeline, à l'aide de Docker. Plusieurs problèmes doivent être résolus :

  1. Comment écrire un Dockerfile ?
  2. Comment écrire .gitlab-ci.yml ?
  3. Comment éviter le problème de la lenteur de chaque déploiement ?
  4. Comment régler l’heure dans le conteneur pour qu’elle soit cohérente avec l’heure locale ?

1.2 Étapes

Cet article prend le projet de service backend python de FastAPI comme exemple à démontrer.

Procédez comme suit:

  • Rédiger BaseDockerfileun document
  • Rédiger Dockerfileun document
  • Rédiger .gitlab-ci.ymlun document

Pipeline de vérification

02 Écrire le fichier BaseDocker

2.1 Écriture

Tout d'abord, vous devez écrire BaseDockerfile. Ce fichier est utilisé pour créer l'image de base. C'est la clé pour résoudre le problème du déploiement lent à chaque fois, car si vous créez l'image à partir de zéro à chaque fois, cela prendra inévitablement beaucoup de temps. , et si nous construisons l'image de base au début, , le temps de chaque déploiement est considérablement raccourci.

Créez un nouveau BaseDockerfilefichier nommé et écrivez le contenu suivant :

# 如果该项目的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 Descriptif

  1. Dans la commande ci-dessus, l'objectif principal de l'utilisation --no-cachede and est d'éviter la mise en cache et de réduire la taille du package de construction.--no-cache-dir

  2. Si le build échoue, cela peut être dû à un manque d'environnement pertinent. Vous pouvez modifier la ligne d'installation de l'outil de fuseau horaire. Modifiez l'exemple :

    # 修改前
    apk add --no-cache tzdata && \
    # 修改后
    apk add --no-cache musl-dev linux-headers g++ tzdata && \
    
  3. N'utilisez qu'une seule commande RUN, plusieurs commandes RUN effectueront des constructions imbriquées, augmentant ainsi la taille.

2.3 Exécution

Lors de son utilisation, renommez le fichier et Dockerfileexécutez la commande suivante dans le même répertoire sous Linux :

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

Visualisez l'image de la base construite :

docker images

03 Écrire un fichier Docker

Créez un nouveau fichier, nommez-le Dockerfileet écrivez le contenu suivant :

# 使用刚才提前构建好的基础镜像
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"]

Construisez l'image :

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

Démarrez le conteneur :

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

04 Écrivez .gitlab-ci.yml

La dernière étape consiste à écrire le fichier .gitlab-ci.yml.
Un exemple de référence simple :

# 两个阶段 - 构建, 部署
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 Structure du projet

À ce stade, la structure globale du projet est la suivante :

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

De cette façon, chaque fois que le code est poussé vers l’extrémité distante, le pipeline peut être automatiquement déployé.
Le temps nécessaire à chaque déploiement a été réduit de 10 minutes précédentes à moins de 20 secondes :
Insérer la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/xuzhongyi103/article/details/133109443
conseillé
Classement