DOCKER配置之DOCKERFILE
要跑深度学习,就要有环境,要有环境就要有虚拟环境管理
一般python管理都会用ANACONDA或者MINICONDA,这个时候使用conda就直接结了,不需要再关心其他事情。
然而部分数据集Ubuntu18.04的环境实在是过于逆天(不是针对某个数据集或代码,只能说大部分数据集和代码都在18.04以及python3.8的远古环境上),所以最后还是只能用docker来进行配置
目前接触到的docker构建镜像的方法包括两类:
1、sudo docker pull:从网上直接拉取镜像,这样拉取到的镜像存放在本地,可以认为是打包成了文件存了起来。
2、sudo docker build:从本地的DOCKERFILE文件直接构建镜像。基本相当于本地直接运行终端指令来给镜像粗布配置一个环境。
下面是一个配置Matterport3DSimulator数据集的例子:
# Matterport3DSimulator # Requires nvidia gpu with driver 396.37 or higher FROM nvidia/cudagl:9.2-devel-ubuntu18.04 # Install cudnn ENV CUDNN_VERSION 7.6.4.38 LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}" # 切换源 RUN sed -i "s@/archive.ubuntu.com/@/mirrors.ustc.edu.cn/@g" /etc/apt/sources.list \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean \ && apt-get update --fix-missing -o Acquire::http::No-Cache=True RUN apt-get install -y --no-install-recommends \ libcudnn7=$CUDNN_VERSION-1+cuda9.2 \ libcudnn7-dev=$CUDNN_VERSION-1+cuda9.2 \ && \ apt-mark hold libcudnn7 && \ rm -rf /var/lib/apt/lists/* # Install a few libraries to support both EGL and OSMESA options ENV DEBIAN_FRONTEND=noninteractive # 切换源 RUN sed -i "s@/archive.ubuntu.com/@/mirrors.ustc.edu.cn/@g" /etc/apt/sources.list \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean \ && apt-get update --fix-missing -o Acquire::http::No-Cache=True RUN apt-get install -y wget doxygen curl libjsoncpp-dev libepoxy-dev libglm-dev libosmesa6 libosmesa6-dev libglew-dev libopencv-dev python-opencv python3-setuptools python3-dev python3-pip RUN pip3 install -i https://pypi.mirrors.ustc.edu.cn/simple opencv-python==4.1.0.25 torch==1.1.0 torchvision==0.3.0 numpy==1.13.3 pandas==0.24.1 networkx==2.2 #install latest cmake ADD https://cmake.org/files/v3.12/cmake-3.12.2-Linux-x86_64.sh /cmake-3.12.2-Linux-x86_64.sh RUN mkdir /opt/cmake RUN sh /cmake-3.12.2-Linux-x86_64.sh --prefix=/opt/cmake --skip-license RUN ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake RUN cmake --version ENV PYTHONPATH=/root/mount/Matterport3DSimulator/build:$PYTHONPATH
可以看到整个镜像的配置流程大概是选取一个基底,安装依赖,最后配置环境变量。
其中的一些基础的操作说明如下:
1、RUN:执行拉取系统镜像本身的终端指令,是最通用的一种指令。
2、ADD:将网上的文件下载到本地,前为链接后为下载名。
3、ENV:环境变量设置。这里是设置的PYTHON库的变量所在位置。环境变量像这样最后在后方加一个$PYTHONPATH就是把以前有的环境变量也以列表的形式加进来。
先用这些指令,Dockerfile大概就可以派上用场了
更为完整的指令集如下:
Dockerfile 指令 | 说明 |
---|---|
FROM | 指定基础镜像,用于后续的指令构建。 |
MAINTAINER | 指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令) |
LABEL | 添加镜像的元数据,使用键值对的形式。 |
RUN | 在构建过程中在镜像中执行命令。 |
CMD | 指定容器创建时的默认命令。(可以被覆盖) |
ENTRYPOINT | 设置容器创建时的主要命令。(不可被覆盖) |
EXPOSE | 声明容器运行时监听的特定网络端口。 |
ENV | 在容器内部设置环境变量。 |
ADD | 将文件、目录或远程URL复制到镜像中。 |
COPY | 将文件或目录复制到镜像中。 |
VOLUME | 为容器创建挂载点或声明卷。 |
WORKDIR | 设置后续指令的工作目录。 |
USER | 指定后续指令的用户上下文。 |
ARG | 定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置。 |
ONBUILD | 当该镜像被用作另一个构建过程的基础时,添加触发器。 |
STOPSIGNAL | 设置发送给容器以退出的系统调用信号。 |
HEALTHCHECK | 定义周期性检查容器健康状态的命令。 |
SHELL | 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。 |
哦,另外最后如果要运行的话,请使用这一句命令:
nvidia-docker run -it --mount type=bind,source=$MATTERPORT_DATA_DIR,target=/root/mount/Matterport3DSimulator/data/v1/scans --volume `pwd`:/root/mount/Matterport3DSimulator mattersim:9.2-devel-ubuntu18.04
其中--mount作用是挂载本地目录到虚拟机目录,也就是创建了一个映射。
挂载一个主机目录作为数据卷(--mount type=bind,source=,target=)source是数据集源目录,target是虚拟机文件目录。
pwd则是设置进入镜像的初始位置。
这样一个matterpord3d数据集的docker就配好了
不用nvidia-docker run 也可以
docker run --runtime=nvidia -it --mount type=bind,source=$MATTERPORT_DATA_DIR,target=/root/mount/Matterport3DSimulator/data/v1/scans --volume `pwd`:/root/mount/Matterport3DSimulator mattersim:9.2-devel-ubuntu18.04
另外这次nvidia-docker跑不起来但是docker可以直接跑,初步判断是由于nvidia版本过高,不能适配ubuntu18.04的原因。