linux根据本地conda虚拟环境进行docker部署

conda环境迁移

  1. 安装conda pack
1. conda install conda-pack
2. pip install conda-pack
  1. 环境打包
conda pack -n py38 -o retinafacenet.tar.gz --ignore-missing-files

-n 选择conda虚拟环境名

-o 在当前位置输出,可设置文件名

-p 在指定位置输出,文件名为虚拟环境名.tar.gz

  1. 迁移环境
  2. 解压打好的包
# 1. 在miniconda3/envs/下创建虚拟环境名的文件夹。
mkdir py38
# 2. 解压包
tar -xzf retinafacenet.tar.gz -C miniconda3/envs/py38/
  1. 运行Django程序
miniconda3/envs/py38/bin/python manage.py runserver 0.0.0.0:5001

也可conda activate py38启动虚拟环境。
打包好的虚拟环境可用于docker中,省去了docker中重新安装依赖库可能出现安装失败,包名错误等问题。

conda打包环境有两个坑

1. linux的pip环境问题

在linux的conda虚拟幻境里,可能会出现pip安装的依赖库,不在虚拟环境的lib/python3.x/site-packages/里。
这样迁移的话,会出现pip安装的依赖库没有随着虚拟环境迁移过来。
这个原因是pip使用的环境变量问题。
解决方法:找到环境变量

vim ~/.profile

在这里插入图片描述
把这段注释或者删除掉,在输入命令

source ~/.profile

再去虚拟幻境里使用pip安装后,会发现pip安装的依赖库也在lib/python3.x/site-packages/产生文件夹。

2.python3.10以上版本问题

tips:在这个过程,如果conda创建的是python3.10以上环境,可能会出现如下图所示问题
在这里插入图片描述
解决方法比较简单粗暴直接把/miniconda3/envs 下使用的虚拟环境打包压缩即可

zip -r  xxx.zip /miniconda3/envs/xxx

然后解压

unzip -d 文件夹 xxx.zip

运行程序

文件夹/bin/python manage.py runserver 0.0.0.0:8000

根据conda环境打包成docker

  1. 安装docker。。。(网上找吧)
  2. 编写Dockerfile
FROM centos:7.9.2009
MAINTAINER changxl.
# opencv-python需要这个环境
RUN yum install libglvnd-glx -y
RUN mkdir /py38/
# 上传虚拟环境,ADD直接帮忙解压了
ADD retinafacenet.tar.gz /py38/
# 复制python工程
COPY retinafacenet/ /retinafacenet/
# 设置工作目录
WORKDIR /retinafacenet/
# 执行命令,省的docker run的时候写在最后面
CMD ["/py38/bin/python","manage.py","runserver","0.0.0.0:5001"]

上面conda环境打的包叫retinafacenet.tar.gz,解压到了/py38/目录下。retinafacenet/是我的工程目录。

为了保险,ADD和COPY操作到文件夹后面的斜杠一定要加,不然的话他们可能认为创建文件。这个跟docker的版本有关系。

注意:这么安装opencv的时候应该用pip install opencv-python!!!!conda isntal opencv似乎没法脱离conda环境调用

  1. 创建镜像
docker build -t facedetection:v1 .

经过漫长的等待,创建好后可通过docker images查看镜像,镜像名是facedetectiontagv1

image-20211130104857887

  1. 镜像发布容器
docker run -dit -p 5001:5001 --name facedetection facedetection:v1 

根据名为facedectectiontagv1的镜像创建名为facedetection的容器。

通过命令docker ps查看容器。

image-20211130105054031

由于我们的Dockerfile中已经写了CMD了,所以发布容器的时候就不需要后面接命令了。

-p 这个端口映射一定要写,docker还没聪明到可以直接找到web工程运行的端口号

docker迁移

容器经过测试可用后,我们就考虑把镜像导出,迁移到服务器中进行项目部署。

  1. 导出docker镜像
docker save -o faceDetection.tar facedetiction:v1

把上面创建好的名为facedectectiontagv1的镜像导出成faceDetection.tar

  1. docker导入本地tar构建镜像
docker load -i faceDetection.tar

导入成功后,可以通过docker images看到有了名为facedectectiontagv1的镜像。

image-20211130104857887

  1. 根据上面镜像发布容器的方式就可以run起来啦~

docker load有个坑

使用docker load时可能会报个错:

Error processing tar file(exit status 1): write /13a84948aa5fe97611a8528db9b26725b3d6c5023cd40940b52a887e3ab33f1a/layer.tar: no space left on device

说没有空间把这个tar包倒进来。

这是因为安装docker的时候没有指定安装路径。

解决方法:

  1. 查看Docker Root Dir
docker info |grep "Docker Root Dir"

image-20211130105631156

可以看到Docker Root Dir指向的是/var/lib/docker

查看一下/var的磁盘容量吧

df -h

image-20211130105819567

确实/var有点小了。

  1. 修改Docker Root Dir

我想将Docker Root Dir修改到/data/docker,所以先创建/data/docker文件夹。

编辑/etc/docker/daemon.json ,添加"data-root":"/data/docker"

vim /etc/docker/daemon.json 

image-20211130110058448

按esc然后:wq保存。

在查看一下Docker Root Dir,发现已经改到/data/docker了。

  1. 重启docker服务
systemctl restart docker

再去执行docker load就可以了。

Logo

更多推荐