【AI】将Python项目打包成Docker镜像的小实践

1.准备工作

  1. 可以本地运行的Python程序
    这个因人而异,可以是Anaconda环境,也可以是本机运行的Python环境,确保python程序是可以正常运行的。
  2. Docker环境
    Docker环境是打包镜像必需的,可以安装Docker Desktop for Windows,也可以是Linux系统安装的Docker环境。
    Docker Desktop
    本文以Windows为例,去官网下载安装包,安装完成之后打开就可以看到这个界面了。不过我还是喜欢用命令行的方式进行操作。安装完之后再打开PowerShell,可以正常使用docker命令。
    在这里插入图片描述
    3.pip生成环境依赖文件requirements.txt
    [推荐]使用pipreqs 写入requirements.txt
    使用pipreqs 写入requirements.txt,只是程序中所用到的包,并不是电脑中安装的所有的包。
pip install pipreqs

cd 到程序所在的文件夹位置
执行下面的语句,Windows下得加encoding=utf8,不然会出现编码问题。

pipreqs ./ --encoding=utf8 

2.编写Dockerfile

我这边采用了两种方式编写Dockerfile,一种是以miniconda为基础镜像,一种是以Python基础环境为基础镜像,为了缩小打包的体积,最后我采用的是第二种方式,为了方便以后备查,我也把第一种方式的Dockerfile放上来。由于打包的是torch程序,依赖比较大,打包的镜像体积在8G+,这也是非常头疼的,不过为了让后期部署调整方便,还是先打一个试试吧。后续会研究Pyinstaller的打包方式。

  1. 以miniconda为基础镜像
# 使用一个基础的Docker镜像,可以根据你的需求选择合适的镜像
FROM continuumio/miniconda3# 设置pip主要源和备用源(切换为国内源,如不是在国内请忽略)
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \pip config set global.extra-index-url https://pypi.org/simple/# 设置工作目录
WORKDIR /app# 复制Conda环境的配置文件(environment.yml)到容器中
COPY environment.yml .# 使用Conda创建环境
RUN conda env create -f environment.yml# 激活Conda环境
RUN echo "source activate my_conda_env" > ~/.bashrc
ENV PATH /opt/conda/envs/my_conda_env/bin:$PATH# 添加你的应用程序代码和文件到容器中
COPY . .# 定义容器启动时运行的命令
CMD ["python", "your_script.py"]

这里面用到了environment.yml,需要通过本地的conda环境来生成。
RUN echo "source activate my_conda_env" > ~/.bashrcENV PATH /opt/conda/envs/my_conda_env/bin:$PATH这两句中的my_conda_env也需要根据environment.yml中的虚拟环境的名称来修改。
CMD ["python", "your_script.py"]中your_script.py要修改成你要执行的python程序。

  1. 以python环境为基础镜像
FROM python:3.9-slimWORKDIR /appADD . /appRUN python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple && pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simpleEXPOSE 8080# 定义容器启动时运行的命令
CMD ["python", "your_script.py"]

这里面用到的requirements.txt就是准备工作中提到的使用pip生成的依赖文件。
Dockerfile文件放到和代码同一目录,然后就可以进行打包镜像了

3.打包镜像

在powershell中cd到程序所在目录,然后执行打包命令,等待打包完成,打包过程会联网请求依赖,打包时间长短取决于网速以及电脑性能。

docker build -t imagename:tag .

打包完成之后,执行docker images命令,即可以看到生成的镜像。
在这里插入图片描述

熟悉desktop的也可以在上面看到镜像:
在这里插入图片描述

4.运行镜像

这部分内容属于docker的操作,不做详细介绍
可以简单的使用交互的方式进行运行:

docker run --rm -it -p 8080:8080 imagename:tag

程序就跑起来了,可以使用浏览器请求8080端口测试了。

5.镜像迁移使用

打包好的镜像在本机的docker上,如果想要部署到其他机器上,可以将镜像打包成tar包,实现镜像的迁移。
在powershell中执行docker save命令即可

docker save -o imagename.tar imagename:tag

默认会在powershell的当前目录下生成imagename.tar文件。
拷贝到其他机器上之后使用docker load命令将镜像添加在本机:

docker load -i imagename.tar

6.运行小插曲

关于docker容器中使用numpy报错OpenBLAS blas_thread_init: pthread_create failed for thread 1 of 40: Operation not permitted
这是由于迁移后的docker版本比生成docker镜像时用的版本低。一般这种情况都是安全性问题,因此在低版本docker上创建容器时,加入–security-opt seccomp:unconfined就可以解决这个问题。

docker run --rm -it -p 8080:8080 --security-opt seccomp:unconfined imagename:tag

参考运行报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/177447.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FineReport -问题学习图表设计图表类型-单元格扩展父子格-报表预览

1,问:为什么本地每次预览都要填帐号密码?答:模板认证关闭一下及可 2.单元格扩展与父子格----左父格-扩展方向-箭头往那个方向就往那个方向 1)数据集参数 在定义数据集时,通过使用if函数判断参数的值是否为空,若为空就不过滤参数,若不为空就进行参数过滤。SELECT * FROM…

win10关闭讲述人、粘滞键功能的快捷键启动

简单记录下在win10关闭讲述人、粘滞键快速启动的快捷键,这两个功能对正常人没什么用。误触发很烦。 禁用讲述人 按windows键,输入“轻松使用设置”,点“讲述人”,如下图取消讲述人开关和快捷键的勾选。 禁用粘滞键 按windows…

使用Pandas进行数据读写的简易教程

Pandas是一个功能强大且广泛使用的Python库。它提供了一种简单而灵活的方式来读取和写入各种数据格式,包括CSV、Excel、SQL数据库等。本文将介绍如何使用Pandas进行数据的读取和写入操作,帮助你快速上手并高效地处理数据。 一、安装和导入pandas 首先&…

HarmonyOS 高级特性

引言 本章将探讨 HarmonyOS 的高级特性,包括分布式能力、安全机制和性能优化。这些特性可以帮助你构建更强大、更安全、更高效的应用。 目录 HarmonyOS 的分布式能力HarmonyOS 的安全机制HarmonyOS 的性能优化总结 1. HarmonyOS 的分布式能力 HarmonyOS 的分布…

【23真题】厉害,这套竟有150分满分!

今天分享的是23年中国海洋大学946的信号与系统试题及解析。 本套试卷难度分析:22年中国海洋大学946考研真题,我也发布过,若有需要,戳这里自取!平均分为109-120分,最高分为150分满分!本套试题内容难度中等&…

keras转onnx,TensorFlow转tf.keras.models.load_model,onnx精度转换

参考: https://blog.csdn.net/Deaohst/article/details/126864267 转onnx 别直接转onnx。 先转PB: import tensorflow as tfmodel_path ./models/model.h5 # 模型文件 model tf.keras.models.load_model(model_path) model.sa…

如何使用Imagewheel+内网穿透搭建私人图床实现公网访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…

04-学成在线之系统管理服务模块之查询数据字典表中的内容,前后端联调测试

前后端联调 配置前端环境 实际开发中先由后端工程师将接口设计好并编写接口文档并交给前端工程师,前后端的工程师就开始并行开发 前端开发人员先自己mock数据即使用假数据进行开发,当后端代码完成后前端工程师尝试请求后端接口获取数据然后渲染到页面 第一步: 首…

spring boot中使用Bean Validation做优雅的参数校验

一、Bean Validation简介 Bean Validation是Java定义的一套基于注解的数据校验规范,目前已经从JSR 303的1.0版本升级到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),目前最新稳定版2.0.2(201…

QGIS结合CityEngine制作卫星图地形模型

参考 https://blog.csdn.net/qq_17523181/article/details/134136379 https://blog.csdn.net/qq_17523181/article/details/134306063 安装QGIS软件与CityEngine软件 一、QGIS获取卫星图 QGIS新建工程安装插件 加入卫星图(需要科学上网),目…

直流有刷电机调速电路,输出端内置14V钳位结构,具有电源电压范围宽、功耗小、抗干扰能力强等功能的国产芯片GS016的描述

GS016是一款直流有刷电机调速电路,输出端内置14V钳位结构,具 有电源电压范围宽、功耗小、抗干扰能力强等特点。通过桥接内部电阻网 络,可以改变PWM占空比输出,达到控制电机转速作用。GS016采用SOP14的封装形式封装。 主要特点&am…

k8s存储

目录 nfs k8s 存储卷 volume pv和pvc 生命周期: PV 的状态 一个PV从创建到销毁的具体流程 pv访问模式 静态Pv的使用 动态storage StorageClass动态创建pv的过程 搭建 StorageClass NFS,实现 NFS 的动态 PV 创建 nfs 理论上nfs 其实并不是存储设备&…