因为参加某个比赛需要构建docker镜像来提交模型,这里记录下过程
首先docker是什么东西?按我个人的理解就是类似于一个小的虚拟环境,把运行时候需要装的东西都打包进去。
最开始的时候是需要下载docker软件,我用的是Ubuntu,安装docker比较简单直接
sudo docker apt-get install docker.io
构建镜像的时候最好有一个基础镜像,这里推荐从阿里云的公共镜像上下载
https://tianchi.aliyun.com/forum/postDetail?spm=5176.12281988.0.0.79652966dOneDf&postId=67720
然后还需要申请一个镜像仓库,这里推荐用阿里云的免费个人镜像仓库,创建个人实例即可
https://www.aliyun.com/product/acr?

使用基础镜像来构建自己的镜像,首先要拉取基础镜像,使用sudo docker pull <镜像仓库:版本号>
这里拉取pytorch的镜像:
sudo docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:latest-py3
拉取好以后使用sudo docker images查看所有镜像,这里的TAG其实就是镜像名冒号后所谓的版本号

在需要打包成镜像的的文件夹下创建Dockerfile,这个相当于打包镜像时的配置文件
# Base Images
## 从天池基础镜像构建(from的base img 根据自己的需要更换,建议使用天池open list镜像链接:https://tianchi.aliyun.com/forum/postDetail?postId=67720)
FROM registry.cn-shanghai.aliyuncs.com/webshell_contest/webshell_detection:base
#FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
##安装python依赖包
#RUN pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
#RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
## 把当前文件夹里的文件构建到镜像的根目录下,并设置为默认工作目录
COPY run.sh run.sh
ADD . /
WORKDIR /
## 镜像启动后统一执行 sh run.sh
CMD ["sh", "run.sh"]
由于我们需要构建的镜像里还包含一些没有用到的包,需要想办法导入,阿里云官网上写的介绍是在Dockerfile下写RUN pip进行导入,实际这个方法比较费时间,特别是调试的时候需要多次打包,每次打包的时候docker都会执行命令去尝试用pip安装这些包到打包后的docker镜像里。
正确的方法应该是进入镜像安装好需要的包和设置,这样打包的时候就不用重复设置
用sudo docker run -it 来进入镜像
sudo docker run -it registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:latest-py3 /bin/bash
进入以后指定清华源升级pip,然后直接安装所需的python包
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
然后同时需要用locale看下默认编码是否是UTF-8,如果不是的话需要更改系统的编码为utf-8不然容易乱码
修改编码:https://blog.csdn.net/qq_43519779/article/details/116566862
同时在py文件开头加上指定utf-8编码的抬头:
# -*- coding: utf-8 -*-
做完配置以后,另起一个命令对话框,输入sudo docker ps查看所有正在运行的容器

这里这个33ed12c4e55就是刚刚我们进入的容器,配置完成以后可以把这个容器推送为新的镜像
sudo docker commit <镜像id> <镜像仓库:版本号>
使用上述命令来构建新的镜像,可以直接使用相同的镜像仓库:版本号来覆盖之前的镜像,原来的镜像不会消失只不过会变成None

这里可以看到原来镜像的TAG变成None了,如果不需要使用的话就可以用sudo docker rmi <镜像id> -f来强制删除这个镜像

这样就准备好了一个拥有我们所需要所有包的镜像,可以在需要打包的文件目录,使用
sudo docker build -t <镜像仓库名:版本号> .
来打包镜像,注意最后一个 . 是打包的路径,当前路径就是 . 所以不能省略
打包好以后直接使用sudo push <镜像仓库名:版本号>就可以把镜像推送到云端,注意这一步需要输入密码来对登录之前申请的镜像仓库