linux环境将python项目打包为docker镜像、上传到docker hub、拉取镜像、修改镜像并保存全过程

整整搞了大半天才完成这个事,主要网络太不稳定了……
我错了,我以为大半天搞定了,实际上没有,又多花了半天时间重新修bug……


首先介绍正常制作镜像和上传流程,后面有我出现的一些错误和解决办法。(血与泪的历程呀,不点个赞吗~)

准备知识

这次摸坑加深了对docker的理解,专业的概念和技术理解网上有很多,这里说一下我的认识。我们在一些需要迁移和迭代更新的项目中使用docker容器,可以方便管理。举个例子,我们将python依赖的第三方库制作成镜像,比如pytorch镜像,那么在其他相同操作系统的机子上直接拉取镜像就好了,不需要自己再配置了,相同于一个独立的环境。另外,可以在docker hub 直接搜想要的镜像。pytorch/pytorch
传送门

一、安装docker

这个就不说了,根据操作系统版本自行安装,注意使用GPU加速的项目需要安装nvidia-docker,后面的步骤也是基于这个。

二、将python项目打包为docker镜像

  1. 首先,python项目应整理在一个文件夹内。进入你运行python项目的虚拟环境,导出运行依赖的第三方库。(这一步也可以自己手写,总之要把得到的requirements.txt文件放入项目文件夹内,方便下一步操作。)
pip freeze > requirements.txt
  1. 编写Dockerfile
    这里提供一个例子,需要特别注意的是找到合适的基础镜像很关键!!比如你的程序是基于某个深度学习框架,那么直接拉取这个框架的镜像就好了。一般会帮你配置好相关环境
#基于的基础镜像

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"]
  1. 制作镜像
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比较简单。因此先说几个打包过程我遇到的问题。

  1. runtime out
    这个应该很常见了,除了添加国内源,暂时还没找到更好的方法。多几遍尝试吧,看运气有时候~ PIP 更换国内安装源

  2. 使用镜像创建容器运行,报错:
    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的基础镜像就没有这个错误了。(当然直接使用深度学习框架的镜像更方便!

  3. 在nvidia/cuda官方提供的镜像中下载,会有几个不同版本。base、runtime、devel三者的版本解释如下。点进去选择适合自己的版本。
    linux环境将python项目打包为docker镜像、上传到docker hub、拉取镜像、修改镜像并保存全过程_第1张图片如果基于nvidia-cuda是不能直接运行python的,会报错 /bin/sh: 1: pip: not found,需要自己重装。

  4. 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 hub

可以直接看这个把本地docker镜像上传到Docker Hub,亲测好用

  1. 去 https://hub.docker.com注册个账号,注册可能需要外网,不太稳定。
  2. 更改镜像名,不改会报错
    docker tag 镜像id docker hub账号名:上传到docker hub上的镜像名
    如:
docker tag eureka:latest ss8795435/eureka:1.0
  1. 上传镜像,执行命令
docker push ss8795435/eureka:1.0

等待完成即可。

四、拉取镜像

  1. 首先要知道镜像的名称,可以在docker hub里搜索。然后执行命令:
    sudo nvidia-docker pull 镜像名:版本号
sudo nvidia-docker pull longshuz/slowfast:1.0
  1. 然后就是一些docker常用操作了,列几个基本的。

使用镜像创建容器

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

五、修改容器后再次打包上传

  1. 我们在对容器中的镜像做了修改之后想要封装后上传,作为下次使用拉取的基础。使用commit命令将容器打包成镜像。

sudo nvidia-docker commit 容器ID 封装后的镜像名

docker commit 0bd244689ed2 ubuntu-vim
  1. 之后再把这个镜像重复上面的上传操作即可。

最后还有一些这次在docker中配置运行环境的问题和解决方法,mark一下。

  1. 出现:_C.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZNK2at11ATenOpTable11reportErrorEN3c1012TensorTypeIdE 这类的错误,一般是在安装某个扩展程序的时候。这里的问题可能是版本不兼容,我也出现了这个错误,pip install torch=1.3.1,把torch=1.2.0改为torch=1.3.1就好了。注意查看这个扩展程序需要的框架版本。
  2. “ImportError: libSM.so.6: cannot open shared object file: No such file or directory”,这是在安装opencv的时候报错,可能是缺少共享文件库,缺啥补啥,利用apt file安装即可。这个博客写得很好

参考文献
制作镜像:
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保存修改后的镜像

你可能感兴趣的:(编码中一些问题,docker)