有不少比赛在赛后代码复现的环节需要以Docker的形式提交代码,甚至有些比赛每次提交都需要提交Docker这样做的好处则是使得测试集不可见,从而杜绝手工标注等违规操作,与此同时增加了提交的复杂度。
老肥在上面也吃了不少苦头,下面对Docker提交代码进行流程的简单梳理,方便后续参考。
简介
Docker是开源的应用容器引擎,Docker镜像则指的是将代码和运行环境打包到成一个只读文件,可以生成可执行容器,类似于:程序设计中类(镜像)和对象(容器)的关系。
Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
构建Docker并打包
Docker的安装还是比较轻松的,照着官方文档
https://docs.docker.com/engine/install
选择对应的操作系统进行安装即可。
这里采用Dockerfile的方式来构建Docker镜像,一个相对通用的Dockerfile模板内容如下(Python版本为3.7,requirements.txt需要根据自身需要说明对应库的版本):
代码语言:javascript复制# 拉取基础镜像
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
# 复制数据
COPY ./ ./
# 更新PIP
RUN pip3 install --upgrade pip
# 安装相关库
RUN pip install -r requirements.txt -i https://mirrors.cloud.tencent.com/pypi/simple
这里更新PIP是必须的,不然后续的库会安装失败。
一些其他的基础镜像可以参考
代码语言:javascript复制Python:
registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
registry.cn-shanghai.aliyuncs.com/tcc_public/python:3.10
TensorFlow:
registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:latest-py3
registry.cn-shanghai.aliyuncs.com/tcc_public/tensorflow:2.8.0-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:1.1.0-cuda8.0-py2
registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:1.12.0-cuda9.0-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:1.13.1-cuda10.0-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:2.4.1-cuda10.1-py3
Keras:
registry.cn-shanghai.aliyuncs.com/tcc-public/keras:latest-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/keras:latest-cuda9.0-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/keras:latest-cuda10.0-py3
pytorch:
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:latest-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:latest-cuda9.0-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.1.0-cuda10.0-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.6-cuda10.1-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.7-cuda11.0-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.11-cuda11.3-py3
mmdetection:
registry.cn-shanghai.aliyuncs.com/tcc-public/mmdetection:pytorch1.3-cuda10.1-py3
registry.cn-shanghai.aliyuncs.com/tcc-public/mmdetection:pytorch1.4-cuda10.1-py3
jupyter:
registry.cn-shanghai.aliyuncs.com/tcc-public/jupyter:gpu
ipython:
registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch_ipython:1.4-cuda10.1-py3
nl2sql:
registry.cn-shanghai.aliyuncs.com/tcc-public/nl2sql:base
facenet:
registry.cn-shanghai.aliyuncs.com/tcc-public/facenet:gpu
java:
registry.cn-shanghai.aliyuncs.com/tcc-public/java:jdk_13.0.2
接着通过命令构建镜像,镜像名和版本都可以自己定义。
代码语言:javascript复制docker build -t <镜像名>:<版本> .
通过运行命令可以检验代码是否有问题(其中run.sh是自己封装的入口脚本,放在镜像的工作目录下)。
代码语言:javascript复制docker run <镜像名>:<版本> sh run.sh
如果需要挂载目录(将宿主机目录挂载到容器中)的可以采用以下命令:
代码语言:javascript复制docker run -v <宿主机路径>:<容器路径> <镜像名>:<版本> sh run.sh
构建并验证完成后可以通过如下命令进行镜像打包,命令如下:
代码语言:javascript复制docker save -o <打包名> <镜像名>:<版本>
打包完,还可以通过加载镜像包来进行加载验证,命令如下:
代码语言:javascript复制docker load -i <打包名>
成堆的镜像非常占用空间,如果需要删除所有
镜像,则可以采取如下命令,先停止容器再删除镜像,如果是windows系统则需要在powershell中运行以下命令。
docker container stop $(docker container ls -aq)
docker rmi -f $(docker images -q)