• 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 文件 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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"]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    文件路径

    在这里插入图片描述

    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"]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    拉去镜像 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 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    寻找 docker 镜像的网站:
    docker hub :https://hub.docker.com/

    在这里插入图片描述

    可以加入限制筛选自己的镜像 ::
    在这里插入图片描述

    通过dockerfile构建镜像

    ### -t 是在终端运行 docker build 指令 
    ### ximenzi_image:v01 其中 ximenzi_image 是我们的自定义的镜像名 ;v01是自定义的版本号
    ### . 是指当前的文件夹  
    docker build -t ximenzi_image:v01 .  
    
    • 1
    • 2
    • 3
    • 4

    通过 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"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    运行结果如下:

    字符串可输出:
    在这里插入图片描述

    路径字符串可输出
    在这里插入图片描述

    如果镜像里面的内容需要修改,退出后,可以本机中使用 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 完成查看 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    使用 docker save 也可以完成镜像保存工作 ,并且可以保存成我们想要的文件形式(比如: .tar.gz 文件 )

    ## 保存镜像操作 
    docker save my_version_new:v001 
    
    ## 保存镜像,并将其压缩成指定的文件操作  (这里保存成 tar.gz 文件) 
    docker save my_version_new:v001 | gzip > my_version_new.tar.gz 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用 docker load 加载 tar.gz 文件的镜像

    docker load -i self_define_image.tar.gz 
    
    • 1

    在这里插入图片描述

    此处使用的 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    总结

    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
  • 相关阅读:
    Oracle高速批量速插入数据解决方案
    关键信息标红
    Android已有应用生成aar 并集成到其他应用内部(本地AAR)
    3D感知(二):单目3D物体检测
    SpringCloud (四) ——Nacos配置管理
    python+java+nodejs+Vue便捷式管理系统(酒店,车票,旅游攻略)的设计php
    【网络安全 --- 任意文件上传漏洞(2)】带你了解学习任意文件上传漏洞
    解决idea启动tomcat控制台中文乱码
    MySQL----redo log重做日志原理及流程
    Word查找红色文字 Word查找颜色字体 Word查找突出格式文本
  • 原文地址:https://blog.csdn.net/qsx123432/article/details/126388699