何为Dockerfile
为了给特定的程序提供特定的运行环境,常用的解决办法是就构建镜像。而Dockerfile就是构建镜像的源代码,Docker程序根据这份源代码在镜像中安装、拷贝文件、设置环境变量。
Dockerfile文件编写
下面列举两个简单样例,说明基本的Dockerfile编写规则:
样例1-极市开发者平台
# 从极市开发者平台基础镜像开始构建
FROM 10.9.0.187/algo_team/cuda10.0-cudnn7.4.2-dev-ubuntu16.04-opencv4.1.1-tensorflow1.13-openvino2020r1
# 创建默认目录,训练过程中生成的模型文件、日志、图必须保存在这些固定目录下,训练完成后这些文件将被保存
RUN mkdir -p /project/train/src_repo && mkdir -p /project/train/result-graphs && mkdir -p /project/train/log && mkdir -p /project/train/models
# 安装训练环境依赖端软件,请根据实际情况编写自己的代码
COPY . /project/train/src_repo/
RUN python3.6 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r /project/train/src_repo/requirements.txt
RUN wget -q http://10.9.0.103:8888/group1/M00/00/02/CgkAZ15ibP2EQwGkAAAAAPNBqdc5432.gz -O /project/train/src_repo/pre-trained-model/ssd_inception_v2_coco_2018_01_28.tar.gz \
&& cd /project/train/src_repo/pre-trained-model/ \
&& tar zxf ssd_inception_v2_coco_2018_01_28.tar.gz -C ./ \
&& mv ssd_inception_v2_coco_2018_01_28/* ./
代码解析:
-
Dockerfile
是构建运行环境(即镜像)的代码文件,通常构建新镜像会从以已有的基础镜像开始,例如这里第一句代码所示,FROM hub.tencentyun.com/algo_team/cuda10.0-cudnn7.4.2-dev-ubuntu16.04-opencv4.1.1-tensorflow1.13-openvino2020r1
,这一行设置了构建训练代码运行环境的基础镜像,这个基础镜像包含CUDA10.0
、cuDNN7.4.2
、ubuntu16.04
、OpenCV4.1
、TensorFlow1.13
、OpenVINO2020r1
等软件;FROM
是Dockerfile
中的关键字,表示基于某个基础镜像执行后续的代码,第一行必须是设置基础镜像的FROM语句剩下的语句通常都属于设置训练程序运行环境的语句,例如建立文件夹,拷贝&安装依赖软件等。
-
第二句
RUN mkdir -p /project/train/src_repo && mkdir -p /project/train/result-graphs && mkdir -p /project/train/log && mkdir -p /project/train/models
,建立训练过程中输出文件的路径;RUN
是Dockerfile
中的关键字,当需要运行某个程序时,需要使用它 -
COPY . /project/train/src_repo/
,将当前仓库的所有文件拷贝到/project/train/src_repo
目录下;COPY
是Dockerfile
的关键字,用于将宿主机(即执行构建命令的主机)的文件拷贝到所构建的镜像内 -
RUN python3.6 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r /project/train/src_repo/requirements.txt
,安装软件依赖; -
最后一句执行了下载并解压预训练模型到指定位置的程序。
wget -q http://10.9.0.103:8888/group1/M00/00/02/CgkAZ15ibP2EQwGkAAAAAPNBqdc5432.gz -O /project/train/src_repo/pre-trained-model/ssd_inception_v2_coco_2018_01_28.tar.gz
是将上传的gz
压缩文件放在指定的文件夹下;tar zxf ssd_inception_v2_coco_2018_01_28.tar.gz
是解压文件;mv ssd_inception_v2_coco_2018_01_28/* ./
是将解压后的文件移动至根目录下。
样例2-阿里天池竞赛
# Base Images
## 从天池基础镜像构建
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
## 把当前文件夹里的文件添加到镜像的根目录下
ADD . /
## 指定默认工作目录为根目录(需要把run.sh和生成的结果文件都放在该文件夹下,提交后才能运行)
WORKDIR /
## 镜像启动后统一执行 sh run.sh
CMD ["sh", "run.sh"]
运行文件编写
运行文件一般是sh
文件,建议命名为run.sh
样例1
################################STEP 1####################################
project_root_dir=/project/train/src_repo #根目录
dataset_dir=/home/data #数据集目录
log_file=/project/train/log/log.txt #日志文件
echo "Preparing..."\
&& cd ${project_root_dir}/frcnn-models/research/ \
&& protoc object_detection/protos/*.proto --py
################################STEP 1####################################
################################STEP 2####################################
echo "Converting dataset..." \
&& python3 -u ${project_root_dir}/convert_dataset.py ${dataset_dir} | tee -a ${log_file}
################################STEP 2####################################
################################STEP 3####################################
wget http://10.9.0.146:8888/group1/M00/00/5C/CgkAa18160KEJvLeAAAAAI4WZK0110.zip -o /project/train/lib/darkflow.tar.gz \
&& cd /project/train/lib/ \
&& tar zxf darkflow.tar.gz -C ./ \
&& mv darkflow/* ./
################################STEP 3####################################
################################STEP 4####################################
echo "start training..." \
&& cd ${project_root_dir} \
&& python3 -u train.py --logtostderr --train_dir=training/ --pipel \
&& echo "Done"
################################STEP 4####################################
################################STEP 5####################################
echo "Exporting and save models to /project/train/models..." \
&& python3 -u ${project_root_dir}/export_models.py | tee -a ${log_file} \
&& echo "saving plots..." \
&& python3 -u ${project_root_dir}/save_plots.py | tee -a ${log_file}
################################STEP 5####################################
样例2
################################STEP 1####################################
project_root_dir=/project/train/src_repo
dataset_dir=/home/data/20
log_file=/project/train/log/log.txt
echo "Preparing..."\
&& cd ${project_root_dir} \
################################STEP 1####################################
################################STEP 2####################################
echo "Converting dataset..." \
&& python3 -u ${project_root_dir}/getimagelabel.py | tee -a ${log_file}
################################STEP 2####################################
################################STEP 3####################################
# 本步骤为解压预训练权重文件并存放在指定位置,
# 若在Dockerfile文件中包含此步骤,这里可以省略
# echo "load resnet50_weights ..." \
# wget -q http://10.9.0.146:8888/group1/M00/01/28/CgkAkl9Dd9uEVn2uAAAAAJBeVG4243.zip -O /project/train/src_repo/resnet50_weights.zip \
# && cd /project/train/src_repo/ \
# && unzip resnet50_weights.zip \
# && mv pre/* /project/train/src_repo/
################################STEP 3####################################
################################STEP 4####################################
echo "start training..." \
&& cd /project/train/src_repo/ \
&& python /project/train/src_repo/keras-frcnn-master/train_frcnn.py -o simple -p /project/train/src_repo/imageslabel.txt --num_epochs 500 --input_weight_path /project/train/src_repo/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5\
&& echo "Done"
################################STEP 4####################################
################################STEP 5####################################
echo "Exporting and save models to /project/train/models..." \
&& cp /project/train/src_repo/keras-frcnn/model_frcnn.hdf5 /project/train/models/epoch01/
################################STEP 5####################################