相关文章推荐

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

参考运行报错

这里给出各个系统安装docker的详细步骤,最后我们不要忘了设置docker加速。 Docker 安装​www.runoob.com/docker/ubuntu-docker-install.html Docker 镜像加速​www.runoob.com/docker/docker-mirror-acceleration.html正在上传…重新上传取消​ 准备python项目 python项目结构 这里简单介绍下各个目录、文件作用 docker_demo 项目
打包项目环境,可以使用 Docker 来构建镜像Docker 可以将应用程序及其依赖项打包到一个可移植的容器中,这个容器可以在任何地方运行。以下是一些基本步骤: 1. 创建一个 Dockerfile 文件,指定基础镜像和安装所需的依赖项。 2. 使用 Docker build 命令构建镜像。 3. 运行容器并将应用程序部署到容器中。 下面是一个简单的示例 Dockerfile 文件: FROM python:3.8-slim-buster WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python", "./app.py" ] 这个 Dockerfile 文件使用 Python 3.8 的 slim 版本作为基础镜像,安装了项目所需的依赖项,并将应用程序复制到容器中。最后,使用 CMD 命令指定容器启动时要运行的命令。 2301_76619509: 将图片展示在地图上,我的会有报错:HTTPError: 500 Server Error: INTERNAL SERVER ERROR for url: http://localhost:53252/api/metadata?&filename=e%3A%5CDP%5Csegment-geospatial%5Cdocs%5Cexamples%5Csatellite.tif File "rasterio\\crs.pyx", line 846, in rasterio.crs.CRS.from_string File "rasterio\\crs.pyx", line 594, in rasterio.crs.CRS.from_epsg rasterio.errors.CRSError: The EPSG code is unknown. PROJ: proj_create_from_database: d:\anconda\envs\py3.11\Lib\site-packages\osgeo\data\proj\proj.db contains DATABASE.LAYOUT.VERSION.MINOR = 2 whereas a number >= 3 is expected. It comes from another PROJ installation 寻求解答 ,感谢 【GEO-AI】SAM-Geo库(segment-geospatial)入门教程 2301_76619509: 将图片展示在地图上我的报错是: File "rasterio\\crs.pyx", line 846, in rasterio.crs.CRS.from_string File "rasterio\\crs.pyx", line 594, in rasterio.crs.CRS.from_epsg rasterio.errors.CRSError: The EPSG code is unknown. PROJ: proj_create_from_database: d:\anconda\envs\py3.11\Lib\site-packages\osgeo\data\proj\proj.db contains DATABASE.LAYOUT.VERSION.MINOR = 2 whereas a number >= 3 is expected. It comes from another PROJ installation HTTPError: 500 Server Error: INTERNAL SERVER ERROR for url: http://localhost:53252/api/metadata?&filename=e%3A%5CDP%5Csegment-geospatial%5Cdocs%5Cexamples%5Csatellite.tif 寻求解答,感谢 【AI】使用阿里云免费服务器搭建Langchain-Chatchat本地知识库 老衲的嫁衣: 好的太难弄了表情包 【AI】使用阿里云免费服务器搭建Langchain-Chatchat本地知识库 AI柱子哥: Cuda加载失败一般是cuda的依赖没有安装好,不要直接pip install来安装cuda依赖,一般会有问题,可以下载whl文件进行安装,samples向量库的话应该也是依赖问题,可以重点排查下
 
推荐文章