0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何创建 Docker 镜像的能力

NVIDIA英伟达企业解决方案 来源:NVIDIA英伟达企业解决方案 作者:NVIDIA英伟达企业解 2022-09-16 09:39 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前一篇文章已经对 Jetson-containers 的容器创建脚本进行较为深入的说明,主要是为了更广泛地适用于不同 JetPack 版本的环境,因此使用嵌套式脚本的处理方式,初看之下会觉得相当繁琐,不过只要将脚本之间负责传递信息的变量内容理清,就会有种豁然开朗的感觉,并不难懂。

本文将带大家继续深入了解 Dockerfile 镜像创建过程中最重要的配置文件内容,更加透彻地了解整个容器镜像的创建过程。

3、使用 docker_build.sh 脚本创建容器:

在 scripst/docker_build_ml.sh 里有三处调用 scripst/docker_build.sh 脚本的部分,才是真正创建个别容器的环节。

以创建 l4t-pytorch 的 build_pytorch() 函数为例,在第 26 行调用 docker_build.sh 脚本并提供所有需要的相关参数:

sh ./scripts/docker_build.sh $pytorch_tag Dockerfile.pytorch     --build-arg BASE_IMAGE=$BASE_IMAGE     --build-arg PYTORCH_URL=$pytorch_url     --build-arg PYTORCH_WHL=$pytorch_whl     --build-arg TORCHVISION_VERSION=$vision_version     --build-arg TORCHAUDIO_VERSION=$audio_version     --build-arg TORCH_CUDA_ARCH_LIST=$cuda_arch_list     --build-arg OPENCV_URL=$OPENCV_URL --build-argOPENCV_DEB=$OPENCV_DEB

再看看 docker_build.sh 内容,里面里其实只有 “docker build -t $CONTAINER -f $DOCKERFILE "$@" .” 这一道创建镜像的指令,而相关所需要的参数都在上图中做好完整的配置。

这里调用了主目录下的 Dockerfile.pytorch,并且以 “--build-arg” 方式将相关参数去对应 Dockerfile.pytorch 配置文件里的变量,这些变量在 Dockerfile 里可能会提供预设值,但是这些新的设定值就会覆盖掉配置文件的预设值。

创建 l4t-tensorflow 镜像的方式也是一样的,在第 172 行 buidl_tensorflow() 函数里第 181~187 行内容(如下),也是调用 docker_build.sh 脚本去执行,不过配置文件改成 Dockerfile.tensorflow,其他需要的参数也有所调整。

sh ./scripts/docker_build.sh $tensorflow_tag Dockerfile.tensorflow   --build-arg BASE_IMAGE=$BASE_IMAGE   --build-arg TENSORFLOW_URL=$tensorflow_url   --build-arg TENSORFLOW_WHL=$tensorflow_whl   --build-arg PROTOBUF_VERSION=$protobuf_version   --build-arg OPENCV_URL=$OPENCV_URL --build-argOPENCV_DEB=$OPENCV_DEB

在第 275~281 行用同样的模式去创建 l4t-ml 镜像,同样调用 docker_build.sh 脚本,不过配置文件换成 Dockerfile.ml,相关配套参数也要根据配置文件内的实际状况进行调整,这里就不重复说明。

4、分析 Dockerfile 内容:

这个项目所提供的脚本,主要功能是为将对应的 Dockerfile 进行变量配置的工作,现在以创建 l4t-ml 镜像会使用到的 Dockerfile.pytorch、Dockerfile.tensorflow 与 Dockerfile.ml 为例,简单说明一下几个环节:

1)检查 Dockerfile 的变量

可以用文字编辑器打开这些文件,使用 “搜索” 功能查找关键字 “ARG”,就能轻松找到里面的各项变量与预设值。

下面列出 Dockerfile.pytorch 的 6 个变量与预设值:

ARG BASE_IMAGE=nvcr.io/nvidia/l4t-base:r32.4.4ARG PYTORCH_URL=https://nvidia.box.com/shared/static/xxx.whlARG PYTORCH_WHL=torch-1.2.0-cp36-cp36m-linux_aarch64.whlARG TORCHVISION_VERSION=v0.4.0ARG TORCH_CUDA_ARCH_LIST="5.3;6.2;7.2;8.7"ARGTORCHAUDIO_VERSION

下面列出 Dockerfile.tensorflow 的 9 个变量与预设值:

ARG BASE_IMAGEARG HDF5_DIR="/usr/lib/aarch64-linux-gnu/hdf5/serial/"ARG MAKEFLAGS=-j$(nproc)ARG PROTOBUF_VERSION=3.19.4ARG PROTOBUF_URL=https://。。。/v${PROTOBUF_VERSION}ARG PROTOBUF_DIR=protobuf-python-${PROTOBUF_VERSION}ARG PROTOC_DIR=protoc-${PROTOBUF_VERSION}-linux-aarch_64ARG TENSORFLOW_URL=https://。。。/。。。-linux_aarch64.whlARGTENSORFLOW_WHL=tensorflow-1.15.3+nv20.9-cp36-cp36m-linux_aarch64.whl

下面列出 Dockerfile.ml 的 10 个变量与预设值:

ARG BASE_IMAGE=nvcr.io/nvidia/l4t-base:r32.4.4ARG PYTORCH_IMAGEARG TENSORFLOW_IMAGEARG MAKEFLAGS=-j$(nproc) ARG PYTHON3_VERSION=3.8ARG CUPY_VERSION=v10.2.0ARG CUPY_NVCC_GENERATE_CODE="arch=compute_53。。。"ARG OPENCV_URL=https://nvidia.box.com/shared/static/。。。.gzARGOPENCV_DEB=OpenCV-4.5.0-aarch64.tar.gz

对照一下前面脚本所提供的参数,这样就能很轻松地了解前面脚本的任务与目的,如果前面脚本中有使用 “--build-arg” 设定的参数值,就会覆盖配置文件内的预设值。

2)导入所需要的基础镜像

这种 docker build 创建容器的方式,是必须基于某个(些)已经存在的基础容器之上,添加的相关依赖库与软件,因此首要工作就是从 “FROM ${BASE_IMAGE}” 导入指定的基础镜像开始,在 Dockerfile.pytorch 与 Dockerfile.tensorflow 就是如此,不过在 Dockerfile.ml 文件中还多了以下两行内容:

FROM ${PYTORCH_IMAGE} as pytorchFROM${TENSORFLOW_IMAGE}astensorflow

就是要从这两个镜像里提取 PyTorch 与 Tensorflow 的配套资源,如下所列的指令:

COPY --from=tensorflow /usr/local/bin/protoc /usr/local/binCOPY --from=tensorflow /usr/local/lib/libproto* /usr/local/lib/COPY --from=tensorflow /usr/local/include/google /usr/local/include/googleCOPY --from=pytorch /usr/local/lib/python2.7/dist-packages/ /usr/local/lib/python2.7/dist-packages/COPY --from=pytorch /usr/local/lib/python${PYTHON3_VERSION}/dist-packages/ /usr/local/lib/python${PYTHON3_VERSION}/dist-packages/COPY --from=tensorflow /usr/local/lib/python2.7/dist-packages/ /usr/local/lib/python2.7/dist-packages/COPY--from=tensorflow/usr/local/lib/python${PYTHON3_VERSION}/dist-packages//usr/local/lib/python${PYTHON3_VERSION}/dist-packages/

这是比较有技巧的安排,然后使用者可以独立创建 l4t-pytorch 与 l4t-tensorflow 镜像,也可以将这两个框架合并在 l4t-ml 镜像内,此时只要将前面两个镜像已经编译安装好的部分复制到新镜像里面里就可以。

我们当然也可以将 Dockerfile.pytorch 与 Dockerfile.tensorflow 里的安装步骤全部放入 Dockerfile.ml 里面,不过这样会让整个配置文件变得非常冗长,估计要超过 400 行的内容,其最大的麻烦之处是会导致除错工作变得相当复杂与冗长,因此这里将处理过程进行分割再做合并。

3)安装依赖库

在 Dockerfile 配置文件内使用 “RUN” 指定后面要执行的指令,后面加上 Ubuntu 使用的 apt-get install、pip install 等方式安装依赖库或软件。由于镜像的操作是设定为 root 用户,因此不需要使用 "sudo" 去取得执行权限。

这个环节的最大困难点是 “要安装哪些内容”?这就需要整理出软件原厂所提供的依赖库列表,这个过程是相对繁琐的,而 Jetson-containers 项目所提供的 12 个 Dockerfile 参考内容,能让我们节省很多摸索的时间。

4)需要编译的部分:

例如在 Dockerfile.pytorch 里面执行 torchvision 的编译安装步骤,如下内容:

RUN git clone https://github.com/pytorch/vision torchvision &&     cd torchvision &&     git checkout ${TORCHVISION_VERSION} &&     python3 setup.py install &&     cd ../ && rm-rftorchvision

在 Dockerfile.tensorflow 文件里有执行 protobuf 与 protoc 的编译安装步骤,如下内容:

RUN cd /tmp &&     wget --quiet --show-progress --progress=barnoscroll --no-check-certificate ${PROTOBUF_URL}/$PROTOBUF_DIR.zip &&     wget --quiet --show-progress --progress=barnoscroll --no-check-certificate ${PROTOBUF_URL}/$PROTOC_DIR.zip &&     unzip ${PROTOBUF_DIR}.zip -d ${PROTOBUF_DIR} &&     unzip ${PROTOC_DIR}.zip -d ${PROTOC_DIR} &&     cp ${PROTOC_DIR}/bin/protoc /usr/local/bin/protoc &&     cd ${PROTOBUF_DIR}/protobuf-${PROTOBUF_VERSION} &&     ./autogen.sh &&     ./configure --prefix=/usr/local &&     make -j$(nproc) &&     make check -j4 &&     make install &&     ldconfig &&     cd python &&     python3 setup.py build --cpp_implementation &&     python3 setup.py test --cpp_implementation &&     python3 setup.py bdist_wheel --cpp_implementation &&     cp dist/*.whl /opt &&     pip3 install dist/*.whl &&     cd ../../../ &&     rm ${PROTOBUF_DIR}.zip &&     rm ${PROTOC_DIR}.zip &&     rm -rf ${PROTOBUF_DIR} && rm-rf${PROTOC_DIR}

在 Dockerfile.ml 里面执行 OpenCV 的编译安装步骤,如下内容:

ARG OPENCV_URL=https://nvidia.box.com/shared/static/5v89u6g5rb62fpz4lh0rz531ajo2t5ef.gzARG OPENCV_DEB=OpenCV-4.5.0-aarch64.tar.gz
COPY scripts/opencv_install.sh /tmp/opencv_install.shRUNcd/tmp&&./opencv_install.sh${OPENCV_URL}${OPENCV_DEB}

上面这三个部分是大部分创建深度学习相关应用的 Docker 镜像所需要的步骤,现在可以直接从 Jetson-containers 这些配置文件中,复制相关步骤到自己的配置文件中,节省大量的尝试与摸索的时间。

5、小结:

智能边缘设备创建 Docker 版本镜像,对应用工程师是一项非常重要的技能,因为这个关系到将来的大量部署与长期维护的问题,因此学习使用 “docker build” 指令配合 Dockerfile 配置文件的方式,是一项必备的能力。

这个 Jetson-containers项目作者为了广泛满足各种状况,特别是 JetPack 的 L4T 版本变化以及对应的 TensorFlow、PyTorch、OpenCV 版本,因此使用多个变量进行调节,但这种方法会让配置文件内容变得相当复杂。

本系列文章的目的就是为大家解开这些变量的意义,让读者能清楚识别出这些变量之间的关系,提升对 Dockerfile 配置文件的了解,最终协助读者进一步简化出自己所需要的特定脚本与配置内容,以自己创建 Docker 镜像的能力。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OpenCV
    +关注

    关注

    32

    文章

    648

    浏览量

    43327
  • 英伟达
    +关注

    关注

    22

    文章

    3983

    浏览量

    94583
  • 镜像
    +关注

    关注

    0

    文章

    178

    浏览量

    11317
  • Docker
    +关注

    关注

    0

    文章

    522

    浏览量

    13175

原文标题:NVIDIA Jetson 系列文章(11):从头创建Jetson的容器(2)

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何判断是否在docker镜像中?

    反馈bash: docker: command not found 4. 算能云主机使用的是 ubuntu 18.04,而 docker 镜像则是 ubuntu 16.04。执行 cat /etc
    发表于 09-20 07:42

    Docker上的Alpine Linux镜像建立

    的,也就是说Alpine Linux是面向安全应用的轻量级 Linux 发行版。 你喜欢存钱吗?我喜欢存钱。更好地资源利用就像拥有幸福的银行账户。 让我们对Docker上的Alpine Linux一探究竟。在Alpine Linux上可以建立属于我们自己的镜像
    发表于 10-12 11:52 0次下载

    浅析Docker镜像本地存储机制及容器启动原理

    Docker 镜像不是一个单一的文件,而是有多层构成。我们可通过 docker images 获取本地的镜像列表及对应的元信息, 接着可通过dock
    发表于 10-19 14:17 2696次阅读

    Docker—简介与镜像用法

    阿里云官方镜像站: ​​https://developer.aliyun.com/mirror/?utm_content=g_1000303593​​ ​ 一、容器简介 Docker是管理容器的引擎
    发表于 11-25 16:28 687次阅读
    <b class='flag-5'>Docker</b>—简介与<b class='flag-5'>镜像</b>用法

    go项目怎么让docker镜像体积减小

    【导读】go 项目怎么让 docker 镜像体积减小?本文做了详细介绍。
    的头像 发表于 06-12 15:07 1667次阅读

    go项目怎么让docker镜像体积减小

    go 项目怎么让 docker 镜像体积减小?本文做了详细介绍。
    的头像 发表于 06-23 10:49 1488次阅读

    Docker镜像的详细讲解

    本文是对 Docker 镜像的详细讲解,讲解了如何安装 Docker、配置 Docker 镜像加速以及操作
    的头像 发表于 08-02 10:00 2620次阅读

    减少docker镜像大小的方法

    Docker 是一种容器引擎,可以在容器内运行一段代码。Docker 镜像是在任何地方运行您的应用程序而无需担心应用程序依赖性的方式。
    的头像 发表于 05-15 11:13 1292次阅读
    减少<b class='flag-5'>docker</b><b class='flag-5'>镜像</b>大小的方法

    Docker 教程:如何将Helix QAC作为容器创建并运行

    在此 Docker 教程中,你将学习如何创建 Helix QAC 并将其作为容器化镜像运行。 Docker 的基本定义是一种开源和流行的操作系统级虚拟化(通常称为“容器化”)技术,它是
    的头像 发表于 10-31 09:36 1383次阅读
    <b class='flag-5'>Docker</b> 教程:如何将Helix QAC作为容器<b class='flag-5'>创建</b>并运行

    docker 搜索镜像,docker查看镜像详细信息(docker下载镜像命令)

    Docker Hub是集中管理的Docker镜像注册中心。通过Docker 用户可以在注册中心搜索、下载和使用CLI命令行工具中的镜像。以下
    的头像 发表于 07-19 09:46 2387次阅读

    如何使用dockerfile创建镜像

    如何使用Dockerfile创建镜像,包括Dockerfile的语法和常用指令,以及具体操作步骤。 编写Dockerfile Dockerfile是构建Docker镜像的必需文件,可以
    的头像 发表于 11-23 09:52 1189次阅读

    手动构建Docker镜像的方法

    不推荐使用docker commit命令,而应该使用更灵活、更强大的dockerfile来构建docker镜像
    的头像 发表于 08-05 15:30 1095次阅读
    手动构建<b class='flag-5'>Docker</b><b class='flag-5'>镜像</b>的方法

    Docker-镜像的分层-busybox镜像制作

    目录 知识点1:镜像的分层 示例:进入 docker hub查看Jenkins的Dockerfile 知识点2:base镜像 知识点3:scratch镜像 scratch
    的头像 发表于 01-15 10:44 711次阅读
    <b class='flag-5'>Docker</b>-<b class='flag-5'>镜像</b>的分层-busybox<b class='flag-5'>镜像</b>制作

    docker-proxy镜像加速仓库

    自建多平台容器镜像代理服务,支持 Docker Hub, GitHub, Google, k8s, Quay, Microsoft 等镜像仓库。
    的头像 发表于 03-06 16:06 588次阅读
    <b class='flag-5'>docker</b>-proxy<b class='flag-5'>镜像</b>加速仓库

    基于Docker镜像逆向生成Dockerfile

    在本文中, 我们将通过理解Docker镜像如何存储数据, 以及如何使用工具查看镜像方方面面的信息来逆向工程一个Docker镜像; 以及如何使
    的头像 发表于 03-10 09:45 766次阅读
    基于<b class='flag-5'>Docker</b><b class='flag-5'>镜像</b>逆向生成Dockerfile