docker镜像制作:制作带有输入参数的docker镜像
一、背景
因参加比赛,需要搭建一个docker镜像。我一看 docker,这个我还真不会呀,直接懵逼,让我制作一个带有深度学习的镜像,而且还要能跑 预训练模型(我用的是 预训练模型+微调的方式);当时我就懵逼了,以为跟阿里的那种docker提交方式一样呢,但是万万没想到,有差距,而且很大!!!
二、阿里比赛中的 docker镜像制作 — 使用 CMD 执行 run.sh 文件
这个参考的是:datawhale 中的 docker 提交项目
文件准备
run.sh 文件
#!/bin/sh
CURDIR="`dirname $0`" #获取此脚本所在目录
echo $CURDIR ## 显示变量的值
cd $CURDIR #切换到该脚本所在目录
python /code/mlp_predict.py ## 要执行的 .py 文件
dockerfile 文件
# Base Images
## 从天池基础镜像构建
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:latest-cuda10.0-py3
## 把当前文件夹里的文件构建到镜像的根目录下(.后面有空格,不能直接跟/)
## 表示将当前电脑下的,当前路径,添加到虚拟镜像中的 / 这个路径下 (根路径下) !!!
ADD . /
## 指定默认工作目录为根目录(需要把run.sh和生成的结果文件都放在该文件夹下,提交后才能运行)
## 指定的是 虚拟镜像中的路径 !!!!!
WORKDIR /
## Install Requirements(requirements.txt包含python包的版本)
## 这里使用清华镜像加速安装
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
#RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
## 镜像启动后统一执行 sh run.sh
CMD ["sh", "run.sh"]
docker pull 推送
#### 1.登录
sudo docker login --username="自己的用户名" registry.cn-shenzhen.aliyuncs.com
#### 2.build
docker build registry.cn-shenzhen.aliyuncs.com/ai_earth_baseline/test_ai_earth_submit:1.0 .
#### 3.push
docker push registry.cn-shenzhen.aliyuncs.com/ai_earth_baseline/test_ai_earth_submit:1.0
三、自定义方法制作深度学习镜像 ,并且可以传入我们要的参数
文件路径
dockerfile 文件
### 这里的my_version指的是 我们拉去的镜像的名称;v01指的是版本号
FROM my_version:v01 ## 需要根据自己的需要更换
### 将本地电脑中的 ./app文件 复制到 虚拟镜像中的 /app 文件中
COPY ./app /app
### 设置 虚拟镜像中的工作地址 /app
WORKDIR /app
### 执行安装库的命令 ;安装我们需要的库函数
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
RUN pip config set install.trusted-host mirrors.aliyun.com
RUN pip install -U pip -i https://mirrors.aliyun.com/pypi/simple
RUN pip install numpy -i https://mirrors.aliyun.com/pypi/simple
RUN pip install argparse==1.1 -i https://mirrors.aliyun.com/pypi/simple
### 当然也可以写在 requirements.txt文件中 ,然后执行 下面的安装命令
### RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
### 完成所有数据的赋值
COPY . .
### 使用这个命令执行,可以省去在 dockerfile 中传入参数的操作
ENTRYPOINT ["python","./app/main.py"]
拉去镜像 docker pull 或者 dockerfile中的FROM拉取镜像
## 使用命令拉去镜像
docker pull nvidia/cuda-arm64:11.1.1-base-ubuntu18.04
## 等同于 ## 等价于 ##
## 在dockerfile 中的 FROM 语句!!!!
FROM nvidia/cuda-arm64:11.1.1-base-ubuntu18.04
寻找 docker 镜像的网站:
docker hub :https://hub.docker.com/
可以加入限制筛选自己的镜像 ::
通过dockerfile构建镜像
### -t 是在终端运行 docker build 指令
### ximenzi_image:v01 其中 ximenzi_image 是我们的自定义的镜像名 ;v01是自定义的版本号
### . 是指当前的文件夹
docker build -t ximenzi_image:v01 .
通过 docker run 运行镜像
### 因为 main.py 文件中有两个参数 input_dir 和 output_dir 所以需要在这里指定一下参数
### -input 指定参数 input_dir
### -output 指定参数 output_file
docker run --rm -it ximenzi_image:v01 -input "aaa" -output "bbb"
#### 等价于 #####
python ./app/main.py -input "aaa" -output "bbb"
运行结果如下:
字符串可输出:
路径字符串可输出
如果镜像里面的内容需要修改,退出后,可以本机中使用 docker commit 完成镜像的保存工作
1. 需要先执行 docker run --rm -itd my_version:v001
2. 然后通过 docker ps 找到 正在执行的容器号
3. 通过 docker exec -t 容器号xxx /bin/bash 进入镜像内部的系统
4. 进行相应的程序文件修改
5. exit 退出 镜像系统
6. 完了之后,在本机的环境中使用 docker commit 容器号xxx-id my_version_new:v001 保存成了另一个镜像
7. 通过 docker images 完成查看
使用 docker save 也可以完成镜像保存工作 ,并且可以保存成我们想要的文件形式(比如: .tar.gz 文件 )
## 保存镜像操作
docker save my_version_new:v001
## 保存镜像,并将其压缩成指定的文件操作 (这里保存成 tar.gz 文件)
docker save my_version_new:v001 | gzip > my_version_new.tar.gz
使用 docker load 加载 tar.gz 文件的镜像
docker load -i self_define_image.tar.gz
此处使用的 main.py 函数
from argparse import ArgumentParser
import os
import numpy as np
def main(input_dir, output_file):
# 调用模型, 输入的测试集文件路径为input_dir, 输出文件到output_file
print(input_dir, "\n")
print(output_file, "\n")
if __name__ == "__main__":
parser = ArgumentParser()
parser.add_argument("-input", type=str, required=True)
parser.add_argument("-output", type=str, required=True)
args = parser.parse_args()
print(np.ones(3))
main(input_dir=args.input, output_file=args.output)
总结
- 书写 dockerfile 文件
- 通过 docker build -t my_image:version001 . 构建镜像
- 得到镜像之后,通过 docker run --rm -it my_image:version001 -input 输入参数 -output 输出参数 完成 运行镜像操作
- 如果需要修改镜像,可以使用 docker commit 容器xxxx-id 新的镜像名my_version_new:版本号v001
- 如果需要将镜像保存为 .tar.gz 文件;可以使用 docker save my_version_new:v001 | gzip > my_version_new.tar.gz
整个程序的流程:
- 进入含有dockfile的文件夹 ;编辑dockerfile
- build 建立镜像
- run 运行
- 当前界面运行:
- 后台运行
- 当前界面运行:
- docker ps 查看正在运行的容器 ;发现没有后台的正在运行的容器,应该是已经执行完了
- docker save 完成保存镜像
参考文章:
- https://mp.weixin.qq.com/s/EpKyRcm3jGk1kMuVLii_hw
- datawhale docker入门项目
- 阿里云ai docker教学
https://tianchi.aliyun.com/course/351/4129?spm=5176.20850343.J_3678908510.5.7b852854Re0vaU