docker镜像制作:制作带有输入参数的docker镜像

docker镜像制作:制作带有输入参数的docker镜像

  • 一、背景
  • 二、阿里比赛中的 docker镜像制作 --- 使用 CMD 执行 run.sh 文件
    • 文件准备
    • run.sh 文件
    • dockerfile 文件
    • docker pull 推送
  • 三、自定义方法制作深度学习镜像 ,并且可以传入我们要的参数
    • 文件路径
    • dockerfile 文件
    • 拉去镜像 docker pull 或者 dockerfile中的FROM拉取镜像
    • 通过dockerfile构建镜像
    • 通过 docker run 运行镜像
    • 如果镜像里面的内容需要修改,退出后,可以本机中使用 docker commit 完成镜像的保存工作
    • 使用 docker save 也可以完成镜像保存工作 ,并且可以保存成我们想要的文件形式(比如: .tar.gz 文件 )
    • 使用 docker load 加载 tar.gz 文件的镜像
    • 此处使用的 main.py 函数
  • 总结
    • 整个程序的流程:
  • 参考文章:

一、背景

因参加比赛,需要搭建一个docker镜像。我一看 docker,这个我还真不会呀,直接懵逼,让我制作一个带有深度学习的镜像,而且还要能跑 预训练模型(我用的是 预训练模型+微调的方式);当时我就懵逼了,以为跟阿里的那种docker提交方式一样呢,但是万万没想到,有差距,而且很大!!!

二、阿里比赛中的 docker镜像制作 — 使用 CMD 执行 run.sh 文件

这个参考的是:datawhale 中的 docker 提交项目

文件准备

docker镜像制作:制作带有输入参数的docker镜像_第1张图片

run.sh 文件

#!/bin/sh
CURDIR="`dirname $0`" #获取此脚本所在目录
echo $CURDIR  ## 显示变量的值  
cd $CURDIR #切换到该脚本所在目录
python /code/mlp_predict.py  ## 要执行的 .py 文件 

dockerfile 文件

docker镜像制作:制作带有输入参数的docker镜像_第2张图片

# 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

三、自定义方法制作深度学习镜像 ,并且可以传入我们要的参数

文件路径

docker镜像制作:制作带有输入参数的docker镜像_第3张图片

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/

docker镜像制作:制作带有输入参数的docker镜像_第4张图片

可以加入限制筛选自己的镜像 ::
docker镜像制作:制作带有输入参数的docker镜像_第5张图片

通过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 

docker镜像制作:制作带有输入参数的docker镜像_第6张图片

此处使用的 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)

总结

  1. 书写 dockerfile 文件
  2. 通过 docker build -t my_image:version001 . 构建镜像
  3. 得到镜像之后,通过 docker run --rm -it my_image:version001 -input 输入参数 -output 输出参数 完成 运行镜像操作
  4. 如果需要修改镜像,可以使用 docker commit 容器xxxx-id 新的镜像名my_version_new:版本号v001
  5. 如果需要将镜像保存为 .tar.gz 文件;可以使用 docker save my_version_new:v001 | gzip > my_version_new.tar.gz

整个程序的流程:

  1. 进入含有dockfile的文件夹 ;编辑dockerfile
    在这里插入图片描述
  2. build 建立镜像
    在这里插入图片描述
  3. run 运行
    • 当前界面运行:
      在这里插入图片描述
    • 后台运行
      在这里插入图片描述
  4. docker ps 查看正在运行的容器 ;发现没有后台的正在运行的容器,应该是已经执行完了
    在这里插入图片描述
  5. 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

你可能感兴趣的:(数据科学项目实战学习,docker,人工智能,深度学习)