linux
根据本地conda
虚拟环境进行docker
部署
conda环境迁移
- 安装conda pack
1. conda install conda-pack
2. pip install conda-pack
- 环境打包
conda pack -n py38 -o retinafacenet.tar.gz --ignore-missing-files
-n 选择conda虚拟环境名
-o 在当前位置输出,可设置文件名
-p 在指定位置输出,文件名为虚拟环境名.tar.gz
- 迁移环境
- 解压打好的包
# 1. 在miniconda3/envs/下创建虚拟环境名的文件夹。
mkdir py38
# 2. 解压包
tar -xzf retinafacenet.tar.gz -C miniconda3/envs/py38/
- 运行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
- 安装docker。。。(网上找吧)
- 编写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环境调用
- 创建镜像
docker build -t facedetection:v1 .
经过漫长的等待,创建好后可通过docker images
查看镜像,镜像名是facedetection
,tag
为v1
。
- 镜像发布容器
docker run -dit -p 5001:5001 --name facedetection facedetection:v1
根据名为facedectection
,tag
为v1
的镜像创建名为facedetection
的容器。
通过命令docker ps
查看容器。
由于我们的Dockerfile中已经写了CMD了,所以发布容器的时候就不需要后面接命令了。
-p 这个端口映射一定要写,docker还没聪明到可以直接找到web工程运行的端口号
docker迁移
容器经过测试可用后,我们就考虑把镜像导出,迁移到服务器中进行项目部署。
- 导出docker镜像
docker save -o faceDetection.tar facedetiction:v1
把上面创建好的名为facedectection
,tag
为v1
的镜像导出成faceDetection.tar
。
- docker导入本地tar构建镜像
docker load -i faceDetection.tar
导入成功后,可以通过docker images
看到有了名为facedectection
,tag
为v1
的镜像。
- 根据上面镜像发布容器的方式就可以run起来啦~
docker load有个坑
使用docker load时可能会报个错:
Error processing tar file(exit status 1): write /13a84948aa5fe97611a8528db9b26725b3d6c5023cd40940b52a887e3ab33f1a/layer.tar: no space left on device
说没有空间把这个tar包倒进来。
这是因为安装docker的时候没有指定安装路径。
解决方法:
- 查看
Docker Root Dir
docker info |grep "Docker Root Dir"
可以看到Docker Root Dir
指向的是/var/lib/docker
。
查看一下/var的磁盘容量吧
df -h
确实/var有点小了。
- 修改
Docker Root Dir
我想将Docker Root Dir
修改到/data/docker
,所以先创建/data/docker
文件夹。
编辑/etc/docker/daemon.json
,添加"data-root":"/data/docker"
vim /etc/docker/daemon.json
按esc然后:wq
保存。
在查看一下Docker Root Dir
,发现已经改到/data/docker
了。
- 重启docker服务
systemctl restart docker
再去执行docker load
就可以了。