【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-slim
 
WORKDIR /app
 
ADD . /app
 
RUN 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/simple
 
EXPOSE 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

参考运行报错

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

升级支持requests库更新:兼容最新urllib3版本及相关库

你是否经常在深夜加班,只为解决一个bug?有时候,我们为了工作的进展和质量,不得不牺牲自己的休息时间。然而,加班并不是没有尽头的,更不是因为我们体贴不够。其实,真正的体贴,应该是让…

Edge最新版本,关闭侧边栏,不需命令,更改设置就可

边栏展示 说明:Edge自动更新版本后(版本 119.0.2151.58),出现了侧边栏,看着很不舒服,效果如上图 修改: 1、在设置找到侧栏 2、点击Copilot后,展示的页面中会有始终显示边栏这一开…

Maven介绍及仓库配置

目录 一.Maven 1.介绍 坐标 仓库 1)中央仓库 2)本地仓库 3)私服 配置国内源 配置过程 二.Maven功能 2.项目构建 3.依赖管理 Maven Help插件 安装 ​使用 一.Maven 1.介绍 坐标 唯一的,通过以下代码的三个键值对确…

简易搜索引擎SEWeibo

背景 有一组微博事件数据,之前做了一些数据分析与挖掘的工作。想着用C做一个简单的搜索引擎玩玩。 亮点: 搜索支持关系关键字作为搜索条件,以文本情感极性作为初筛条件,以TF-IDF为搜索排序依据以Reactor模式为基础,…

电源电压范 围宽、功耗小、抗干扰能力强的国产芯片GS069适用于电动工具等产品中,采用SOP8的封装形式封装

GS069电动工具直流调速电路是CMOS专用集成电路,具有电源电压范 围宽、功耗小、抗干扰能力强等特点。通过外接电阻网络,改变与之相接 的VMOS 管的输出,达到控制电动工具转速的作用。该电路输出幅值宽, 频率变化小,占空比…

linux系统下如何获取文件的创建时间

1. ll 或 ls -l config.json 查看时间 2. 使用stat 查看创建时间 access time:表示我们最后一次访问(仅仅是访问,没有改动)文件的时间 modify time:表示我们最后一次修改文件的时间 change time:表示我们最…

2023 PostgreSQL 数据库生态大会:解读拓数派大数据计算系统及其云存储底座

11月3日-5日,由中国开源软件推进联盟 PostgreSQL 分会主办的中国 PostgreSQL 数据库生态大会在北京中科院软件所隆重举行。大会以”极速进化融合新生”为主题,从线下会场和线上直播两种方式展开,邀请了数十位院士、教授、高管和社群专家&…

【Flink】Flink任务缺失Jobmanager日志的问题排查

Flink任务缺失Jobmanager日志的问题排查 问题不是大问题,不是什么代码级别的高深问题,也没有影响任务运行,纯粹因为人员粗心导致,记录一下排查的过程。 问题描述 一个生产环境的奇怪问题,环境是flink1.15.0 on yarn…

音画欣赏|《纯洁的梦乡》

《纯洁的梦乡》 80x60cm 陈可之2021年绘 题龙阳县青草湖 【元】唐温如 西风吹老洞庭波,一夜湘君白发多。 醉后不知天在水,满船清梦压星河。 车遥遥篇 【宋】范成大 车遥遥,马憧憧。 君游东山东复东,安得奋飞逐西风。 愿我如星…

自定义windows右键菜单,软件卸载后 右键菜单残留 打开方式残留 解决方法

问题: 更改windows右键菜单软件卸载残留,其仍然出现在文件的打开方式列表,右键菜单中。 解决方法1:推荐使用registry workshop批量搜索删除注册表 绿色版: 蓝奏云:https://wwzd.lanzouw.com/iPJNp1em339…

centos下安装mysql8版本

1、如果服务器没有wget,先下载wget工具 sudo yum install wget 2、下载指定mysql版本的tar包 sudo wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.21-1.el7.x86_64.rpm-bundle.tar 3、解压tar包 sudo tar -xvf mysql-8.0.21-1.el7.x86_64.rpm…

第三篇 基于JSP 技术的网上购书系统—— 数据库系统设计(网上商城、仿淘宝、当当、亚马逊)

目录 1.逻辑关系设计 2.物理设计 2.1管理员表 2.2留言表 2.3会员登录表 2.4会员表 2.5订单表 2.6订单商品表 2.7产品表 2.8产品货架表 2.9收藏表 2.10类别表 2.11新闻表 数据库系统是用来保存数据的软件系统,当今比较流行的数据库系统,如 MS…

学好Python-新手小白如何做?

新手小白如何学好Python?有哪些参考方法吗?这是一个老生常谈的话题了。今天为大家带来两位前辈的分享,他们给出了非常实用的方法和思路,希望对你有所帮助。 1、多练,两个字:多练 如果真的要说方法可以参考如下: ①…

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

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

数据结构笔记 B 树 B+树

1 B树 Balanced 树,多路平衡搜索树 1.1 特征 一个m阶的B树具有如下几个特征: 根结点的儿子数为[2, M];除根结点以外的非叶子结点的儿子数为[M/2, M];(M/2向上取整)每个结点存放至少M/2-1(M/2向上取整&a…

在Ubuntu系统上部署Inis博客,并使用内网穿透将博客网站发布到公共互联网上

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

Pandas画图报错:ValueError: signal only works in main thread

Pandas画图报错:ValueError: signal only works in main thread 基于Django 解决方法 按如下方式运行服务器 python manage.py runserver --nothreading --noreload

录音频用什么软件?助你轻松捕捉声音!

“有没有什么录音频的软件推荐呀?学校要求拍摄一个关于交通安全的纪录片,现在视频拍摄好了,音频却出了问题,需要重新补录声音,但是找不到合适的录音频软件,有人知道吗?” 录制音频是我们在工作…

Linux共享内存

共享内存&#xff1a;进程直接访问共享内存&#xff0c;由使用者进行访问控制&#xff08;互斥等&#xff09; 使用ipcs命令查看系统共享内存 POSIX 共享内存 有名共享内存 多个进程通过共享内存的名字来获取同一块共享内存&#xff0c;实现共享 #include <stdio.h>…

沉醉于代码的境界:探寻计算机书籍的奇妙之旅

文章目录 书中的代码乐章科技解密的乐趣技术指南的引路明灯书籍带给我的启示结语 &#x1f389;欢迎来到数据结构学习专栏~沉醉于代码的境界&#xff1a;探寻计算机书籍的奇妙之旅 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f38…