Lazy loaded image
记录-Docker打包Python-Web服务
字数 1144阅读时长 3 分钟
2025-12-14
2025-12-21
AI智能摘要
GPT
获取文章摘要失败,请稍后再试。
URL
type
status
date
slug
summary
tags
category
icon
password
😀
最近,博主训练了几个模型,想将模型部署到服务器上,并且暴露API供其他服务调用。这几个不是Transformer类型,仅仅是机器学习模型和自己构建的卷积模型。这次无法通过VLLM框架部署,只能通过docker打包python-web整个服务。
Docker在打包python-web服务时,会一起打包python依赖和代码镜像。如果直接将两者打包,那么,打包时间会很长,而且,只要代码一有变动,就要重新打包。这种一次性打包的方法费时费力。
针对这种方法,结合网上已有资料,博主进行两次打包:第一,打包基础环境镜像;第二,基于基础镜像打包代码。

基础环境打包

基础环境打包分为两个阶段:构建阶段和运行阶段。构建阶段用于编译和安装依赖,这里会用来安装gcc(C语言库编译工具)、default-libmysqlclient-dev(mysqlclient编译工具)和pkg-config(编译时查找库的配置工具)等。运行阶段用于安装运行时必须的库,不包含编译工具。

构建阶段

  • FROM python:3.11-slim AS builder
    • AS builder 构建阶段的标志
  • RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources
    • 设置国内镜像
  • WORKDIR /app
    • 设置工作目录,后续所有的操作皆在此目录执行
  • RUN apt-get update && apt-get install -y --no-install-recommends\ gcc\ pkg-config \ default-libmysqlclient-dev \ # build-essential \ && rm -rf /var/lib/apt/lists/*
    • apt-get update 更新软件包列表
    • apt-get install -y 自动确认安装
    • --no-install-recommends 不安装推荐包
    • rm -rf /var/lib/apt/lists/* 删除缓存文件
  • COPY requirements_gsw.txt . 复制宿主机的 requirements_gsw.txt到容器的app目录
  • RUN find /install -type d -name "pycache" -exec rm -rf {} + 2>/dev/null || true \ && find /install -type f -name ".pyc" -delete \ && find /install -type f -name ".pyx" -delete \ && find /install -type f -name ".pxd" -delete \ && find /install -name ".dist-info" -type d -exec sh -c 'rm -rf "$1"/RECORD "$1"/INSTALLER' _ {} \; \ && find /install -name "*.so" -exec strip --strip-unneeded {} \; 2>/dev/null || true
    • 这段代码的作用是清理安装后的文件,用于删除缓存、源文件、元数据和压缩共享库,用于减小镜像体积。
    • find /install -type d -name "pycache" -exec rm -rf {} + 2>/dev/null || true \ 删除python缓存
    • && find /install -type f -name ".pyc" -delete \ && find /install -type f -name ".pyx" -delete \ && find /install -type f -name ".pxd" -delete \ 删除Cython源文件
    • find /install -name ".dist-info" -type d -exec sh -c 'rm -rf "$1"/RECORD "$1"/INSTALLER' _ {} \; 清理包源数据
    • find /install -name "*.so" -exec strip --strip-unneeded {} \; 2>/dev/null || true 压缩共享库

运行阶段

  • FROM python:3.11-slim
    • 基础的python包
  • RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources
    • 设置国内镜像
  • WORKDIR /app
    • 设置工作目录,后续所有的操作皆在此目录执行
  • RUN apt-get update && apt-get install -y --no-install-recommends \ libmariadb3 \ && apt-get clean \ && rm -rf /tmp/* \ && rm -rf /var/tmp/* \ && rm -rf /var/lib/apt/lists/* \ && rm -rf /usr/share/doc/* \ && rm -rf /usr/share/man/*
    • --no-install-recommends 只安装依赖不安装推荐包
    • libmariadb3 是 MariaDB 运行时库,与 MySQL 完全兼容,体积更小
  • COPY --from=builder /install /usr/local
    • 从构建阶段复制已安装的 Python 包
  • EXPOSE 8000
    • 申明容器监听 8000 端口
    • 实际映射需要 docker run -p 8000:8000
 

最终执行命令

docker build —no-cache -f 上面的文件名.base -t 镜像名:latest .

基于基础镜像打包代码

构建阶段

  • FROM 镜像名:latest
  • WORKDIR /opt/mss # 工作目录
  • RUN OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 python 启动python文件名.py collectstatic --noinput
    • 收集静态文件
  • COPY start.sh /opt/mss/start.sh
    • 复制启动脚本并赋予执行权限
    • start.sh # Linux 启动项目的文件
  • RUN sed -i 's/\r$//' /opt/mss/start.sh && chmod +x /opt/mss/start.sh
    • /opt/mss/start.sh 对应上边的工作目录
  • CMD ["/opt/mss/start.sh"]
    • 启动脚本

最终执行命令

docker build -f 上面的文件名.app -t 镜像名:latest .

启动镜像,创建容器

docker run -d —name 容器名 —restart unless-stopped -p 8000:8000 —env-file .env -v “本地文件名:/app/logs” -v “本地文件名:/app/media/models” 镜像名:latest
  • -d 容器在后台运行
  • -v 映射 本地映射到容器中
  • —env-file 配置环境
    • 从 .env 文件中读取环境变量
    • 注入到容器内部
  • —restart unless-stopped Docker启动时,自动重启
 
💡
以上便是docker打包python-web服务镜像的基本流程,欢迎您在底部评论区留言,一起交流~
上一篇
AI稀土新闻日总结2026-02-01
下一篇
VScode插件(一)

评论
Loading...