当前位置:首页>python>Docker打包Python-Web服务

Docker打包Python-Web服务

  • 2026-09-02 19:05:15
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 pip install --no-cache-dir --prefix=/install -r requirements_gsw.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    • --no-cache-dir 不保存 pip 缓存,减小镜像体积
    • --prefix=/install 安装到自定义位置,如果没有则会安装到默认位置/usr/local/lib/python3.11/site-packages/
    • -i https://pypi.tuna.tsinghua.edu.cn/simple 安装python
  • 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启动时,自动重启

最新文章

随机文章