Каталог статей
01 Фон спроса
1.1 Требования
У меня есть проект Python, который может быть программой мониторинга сервера или серверной программой.Теперь мне нужно развернуть проект на сервере конвейерным способом, используя Docker. Необходимо решить несколько вопросов:
- Как написать Dockerfile?
- Как написать .gitlab-ci.yml?
- Как избежать проблемы, когда каждое развертывание занимает много времени?
- Как настроить время в контейнере в соответствии с местным временем?
1.2 Шаги
В этой статье в качестве примера рассматривается проект серверной службы Python FastAPI.
Действуйте следующим образом:
- Написать
BaseDockerfile
документ - Написать
Dockerfile
документ - Написать
.gitlab-ci.yml
документ
Конвейер проверки
02 Запись файла BaseDocker
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 Описание
-
В приведенной выше команде основная цель использования
--no-cache
и--no-cache-dir
— избежать кэширования и уменьшить размер пакета сборки. -
Если сборка не удалась, это может быть связано с отсутствием соответствующей среды. Вы можете изменить строку для установки инструмента часового пояса. Измените пример:
# 修改前 apk add --no-cache tzdata && \ # 修改后 apk add --no-cache musl-dev linux-headers g++ tzdata && \
-
Используйте только одну команду RUN, несколько команд RUN будут выполнять вложенные сборки, увеличивая размер.
2.3 Исполнение
При его использовании переименуйте файл и Dockerfile
выполните следующую команду в том же каталоге в Linux:
docker build -t <镜像名称>:<镜像标签> .
# 例如
docker build -t python_fastapi:3.11.5-alpine .
Просмотрите построенный базовый образ:
docker images
03 Запись Docker-файла
Создайте новый файл, назовите его 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 секунд: