如何制作专属的docker image
首先拉取一个base docker
可以从官网拉各种image或者用Dockerfile生成一个。这里我直接pull了一个只装了caffe依赖的lib和cuda的image。
docker pull 10.100.208.171:6000/caffe:ubuntu-latest
安装cudnn6
将本地路径挂载到docker的home下然后安装cudnn6,这个命令已经进入了docker image,mount只是为了能让docker读取外面的数据
docker run -it --rm -v /datab/cv_data/cudnn-8.0-linux-x64-v6.0:/home 10.100.208.171:6000/caffe:ubuntu-latest /bin/bash
docker image中编译caffe
和在本地一样下载所有需要的lib和Python lib,还有caffe项目以及自定义的layers, functions等,正常编译
由于我想制作一个完全的docker images所以我把我的caffe项目装在/opt中(注意不要装到挂载的文件夹下,否则无法装入docker里),因为我发现mount的东西无法写入到docker images里
apt-get install vim
for req in $(cat requirements.txt); do pip install $req; done
注意这里会报一个hdf5.h的错误,因为lib文件的更新需要修改makefile
然后同样的make all -j8, make pycaffe就可以在docker image里编译caffe了,最后安装pycaffe到系统python path
但是注意了这里有个大坑!!!
对于普通的系统环境在/etc/profile中添加
export PYTHONPATH=/opt/caffe/python:$PYTHONPATH
source /etc/profile就能使pycaffe生效
这是docker,一切变得与众不同。在docker中/etc/profile中的变量不是自动就export的,完整的os在启动过程会有启动程序依次读取系统和用户的配置文件,但在容器里就没有这一步了。
查找资料只有两种解决方式
第一种,把变量写入/root/.bashrc这个文件,就会自动读取你的变量(我就采用了把变量写入这个文件)
第二种,在Dockerfile里添加ENV解决
保存制作好的docker image
另开一个终端
docker commit CONTAINER_ID tag #CONTAINER_ID是docker ps里看见的
docker commit 69023d45f5d2 custom-caffe-cuda8-cudnn6
进入这个docker image
docker run -it --rm custom-caffe-cuda8-cudnn6 /bin/bash
推送docker image到服务器上
docker tag myImage myRegistry.com/myImage
docker push myRegistry.com/myImage
示例如上,先tag,必须加域名或者ip地址才能推送过去(不能自定义一个帅气的名字了:()
docker tag custom-caffe-cuda8-cudnn6 10.100.208.171:6000/zoujy-caffe
docker push 10.100.208.171:6000/zoujy-caffe
删除docker image
docker rmi REPOSITORY TAG
保存images和加载一个image tar
docker save 10.100.208.171:6000/zoujy-caffe -o caffe.tar
docker load -i caffe.tar
这里演示了一个如何用docker来制作一个能随时编译修改的caffe的docker image。既然caffe都能做成了那么对于tensorflow,pytorch, keras等就更简单了