整整搞了大半天才完成这个事,主要网络太不稳定了……
我错了,我以为大半天搞定了,实际上没有,又多花了半天时间重新修bug……
首先介绍正常制作镜像和上传流程,后面有我出现的一些错误和解决办法。(血与泪的历程呀,不点个赞吗~)
这次摸坑加深了对docker的理解,专业的概念和技术理解网上有很多,这里说一下我的认识。我们在一些需要迁移和迭代更新的项目中使用docker容器,可以方便管理。举个例子,我们将python依赖的第三方库制作成镜像,比如pytorch镜像,那么在其他相同操作系统的机子上直接拉取镜像就好了,不需要自己再配置了,相同于一个独立的环境。另外,可以在docker hub 直接搜想要的镜像。pytorch/pytorch
传送门
这个就不说了,根据操作系统版本自行安装,注意使用GPU加速的项目需要安装nvidia-docker,后面的步骤也是基于这个。
pip freeze > requirements.txt
#基于的基础镜像
FROM python:3.7
#维护者信息
MAINTAINER
#代码添加到code文件夹
ADD ./项目路径 /code
#设置code文件夹是工作目录
WORKDIR /code
安装支持
RUN pip install --default-timeout=1000 -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
CMD ["python", "/code/cam_demo.py"]
docker build -t imagename Dockerfilepath
#Dockerfilepath:Dockerfile 所在文件夹名称,当前名录为 “.”
如:docker build -t d_t .
这里注意,制作镜像的过程对应了前面写的Dockerfile,因此安装依赖包的语句强烈推荐使用国内源,默认源简直折磨的要死,国内源虽然有时候也不稳定,但至少快一些。
最后,制作成功会返回镜像ID,记录一下。
查看当前系统中的镜像
docker images
运行镜像
docker run -d --name c_name imagename
以上是将python项目打包为docker镜像的过程,上传到docker hub比较简单。因此先说几个打包过程我遇到的问题。
runtime out
这个应该很常见了,除了添加国内源,暂时还没找到更好的方法。多几遍尝试吧,看运气有时候~ PIP 更换国内安装源
使用镜像创建容器运行,报错:
libcudart.so.10.0: cannot open shared object file: No such file or directory
原因应该是CUDA版本和你依赖库的版本不符问题,也有可能是你根本没有在容器中配置好CUDA。比如上述示例中的代码,我先基于python:3.7的基础镜像制作,就会出现这个错误,因为python:3.7的镜像没有配置好CUDA;我再次改为基于nvidia/cuda的基础镜像就没有这个错误了。(当然直接使用深度学习框架的镜像更方便!)
在nvidia/cuda官方提供的镜像中下载,会有几个不同版本。base、runtime、devel三者的版本解释如下。点进去选择适合自己的版本。
如果基于nvidia-cuda是不能直接运行python的,会报错 /bin/sh: 1: pip: not found,需要自己重装。
Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_location=torch.device(‘cpu’) to map your storages to the CPU.
原因如上述问题2,CUDA配置问题,建议直接拉取pytorch基础镜像。
可以直接看这个把本地docker镜像上传到Docker Hub,亲测好用
docker tag eureka:latest ss8795435/eureka:1.0
docker push ss8795435/eureka:1.0
等待完成即可。
sudo nvidia-docker pull longshuz/slowfast:1.0
使用镜像创建容器
sudo nvidia-docker run -it 【ID】 /bin/bash
使用镜像创建容器,并将工作目录挂载到容器上
sudo nvidia-docker run -it -v 挂载地址:/workspace 【ID】 /bin/bash
启动容器
sudo nvidia-docker start 【ID】
进入容器
sudo nvidia-docker exec -it 【ID】 /bin/bash
sudo nvidia-docker commit 容器ID 封装后的镜像名
docker commit 0bd244689ed2 ubuntu-vim
最后还有一些这次在docker中配置运行环境的问题和解决方法,mark一下。
参考文献
制作镜像:
https://blog.csdn.net/weixin_44286547/article/details/88980233
python项目代码打包成Docker镜像(写得比较实用)
http://www.freesion.com/article/70817751/
docker官方仓库查找英伟达cuda开发镜像方法
上传镜像:
把本地docker镜像上传到Docker Hub
Docker 如何把镜像上传到docker hub
修改镜像并上传:
容器修改完成的镜像打包到自己的docker hub
Docker保存修改后的镜像