转载自:https://mp.weixin.qq.com/s/Wf1aCGhl4U64SWiAe6My_Q

【泡泡Docker乐园】Dockerfile简易教程 & LARVIO镜像

原创 泡泡机器人 泡泡机器人SLAM 2020-04-07

泡泡Docker乐园,带你进入Docker的狂欢派对

简介:【泡泡Docker乐园】第二期来啦!本期我们将简要介绍利用Dockerfile进行image构建的方法。利用Dockerfile可以将image构建的完整过程清晰的展现出来,同时也可方便用户复用layer,减少构建新image的时间开销。最后将提供一个用Dockerfile构建的image项目,单目视觉惯性里程计LARVIO。

编辑:邱笑晨

审核:王强,刘富强,吴奇,王琛

欢迎个人转发朋友圈;其他机构或自媒体如需转载,后台留言申请授权

前言

本期将简要的介绍利用Dockerfile构建image的方法。

在上一期中,image的构建采用的步骤是:首先pull一个现成的image,然后实例化一个该image的container,再在该container中进行各种操作,最后将该container进行提交(commit),从而构建一个新的image。这比较符合我们通常在虚拟机中的工作流程,即进入虚拟系统,然后在该系统内进行各种操作。

这种方式的一个缺点是,其他人在拿到这个image时无法容易地知晓该image到底是如何构建的。同时一些可复用的操作在我们下一次构建新image时又要重新来一遍,比较浪费时间。

Docker中提供了另外一种构建image的方式,即采用Dockerfile。在Dockerfile中,我们可以实现构建image所需的一切操作,包括pull基础image、安装各种库、编辑脚本等等等等。所有的操作都以明文的形式写在Dockerfile中,方便用户掌握构建image的步骤,同时每一条Dockerfile语句都形成一层(layer),当用户在同一基础image上有相同操作时,这些layer可以方便的进行复用,无需重新构建。

Dockerfile基础指令

这部分将介绍一些Dockerfile中常用的基础指令,我们将以ROS的一个官方镜像ros/kinetic-ros-core的Dockerfile为例来进行介绍,地址为:

https://github.com/osrf/docker_images/blob/b075c7dbe56055d862f331f19e1e74ba653e181a/ros/kinetic/ubuntu/xenial/ros-core/Dockerfile

该Dockerfile中所采用的指令并不是全部,但这些指令通常已经能够替代“在container中操作再commit”的image构建过程,能够满足绝大多数需求。

事实上,如果你发现有操作无法在Dockerfile中完成,那一定是你还没找到或者还没理解某些指令。

FROM指令

FROM指令用来指定所要构建的image的基础image。你可以在任意本地或者DockerHub的基础上进行新image的构建,因此FROM指令可以指向本地或者DockerHub上任意可用的image。

ros/kinetic-ros-core中,该指令的用法为:

FROM ubuntu:xenial

这表示该image是以ubuntu的xenial标签为基础image进行构建的。在后面的构建过程中,该指令会自动从DockerHub中pull下该基础image。后续的其他指令则都基于该image执行。

在DockerFile中,每一条指令语句都构成一个layer,FROM语句一般构成所构建image的第一个layer。

RUN指令

RUN指令用来指明在上一layer基础上要继续进行的操作。它代替了我们进入container中执行各种终端命令来进行配置的过程。任何需要执行终端指令来构建新image的操作,都可以利用RUN来实现。

ros/kinetic-ros-core中,使用了若干条RUN指令(受限于篇幅,我们只截取部分):

RUN apt-get update && apt-get install -q -y \    dirmngr \    gnupg2 \    && rm -rf /var/lib/apt/lists/*RUN apt-key adv ...RUN echo ...

细心的同学们会发现,RUN后面跟的内容和我们在container的终端中执行的指令是一样的。

上面的三条RUN指令,每一条形成一个layer。笔者的建议是,尽量将RUN指令模块化,比如我们要装某个软件,那么可以把所有与该软件相关的依赖项以及该软件的安装都放在一条RUN语句中,这样可提高Dockerfile的可读性,同时也便于复用。不过一个image的layer数是有限制的,因此也要注意不要让层数过多。

ENV指令

ENV指令用来设置环境变量,我们直接用ros/kinetic-ros-core中的例子来说明:

ENV ROS_DISTRO kineticRUN rosdep init && \    rosdep update --rosdistro $ROS_DISTRO

可以看到,通过ENV指令设置的环境变量ROS_DISTRO,在后面的RUN指令中被利用。这种用法的好处是,如果我们有某个参数的修改会影响到DockerFile中所有终端命令的执行,那么我们可以设置一个环境变量,通过只修改一处环境变量,即可实现全部终端指令的调整。

同时ENV当然还具备其字面意义的功能,即为image设置一些所需要的环境变量。

COPY指令

COPY指令是懒人福音。尽管RUN指令可以实现所有的终端命令,但有些操作我们可能还是会觉得利用终端来做比较麻烦,比如写一个比较长的脚本。

COPY命令的基本作用是将外部文件复制到image中,我们可以利用这一点,先在宿主机中写好一个脚本,然后直接COPY进去,避免写一个又臭又长的RUN语句。

当然了,一旦采用这种用法,那么如果要了解构建的所有细节,就无法单从Dockerfile中得知了,还需要去看一下外部的这个脚本到底写的是什么。

来看看ros/kinetic-ros-core中的用法:

COPY ./ros_entrypoint.sh /

这里是将本地的一个已经写好的ros_entrypoint.sh文件拷贝到新image的根目录下。

COPY指令中的首个路径可以是宿主机绝对路径或者Dockerfile所在路径的相对路径。一般建议将所需要COPY的文件都放在和Dockerfile的同一级目录。

ENTRYPOINT指令

ENTRYPOINT指令用来指定构建的image实例化时调用的程序。在ros/kinetic-ros-core中其用法为:

ENTRYPOINT ["/ros_entrypoint.sh"]

这其实是将我们在之前COPY进来的脚本作为container初始调用的程序。

CMD指令

CMD指令用来设置构建的image实例化时调用的默认命令,该命令会被docker run中传递的命令(如果有的话)覆盖。在ros/kinetic-ros-core中其用法为:

CMD ["bash"]

这即是说在创建container时会调用bash开启一个终端。

小结

这部分以ros/kinetic-ros-core的Dockerfile为例介绍了一些最基本和常用的Dockerfile指令的基本用法,更多指令和详细用法请参考官方文档:

https://docs.docker.com/engine/reference/builder/

利用Dockerfile构建image

当写好一个Dockerfile之后,构建image就是一句话的事了,当然还需要注意把你想要COPY到image中去的文件准备好(如果有的话)。执行以下指令即可:

docker build -t IMG_NAME DOCKERFILE_PATH

这里我们直接用本期提供的LARVIO镜像作为示例:

注意到该image共有15个layer,也就是说一共有15条语句,由于我之前已经构建过,因此这里显示的都是Using cache。

LARVIO项目镜像

本期我们为小伙伴们带来一个单目视觉惯性里程计项目的image——LARVIO。

简介:LARVIO是一款基于MSCKF的单目视觉惯性里程计,提供动/静态场景的自动初始化、可选的在线传感器标定(IMU-CAM外参、时标误差、IMU内参)、hybrid MSCKF/纯MSCKF可选、一维/三维逆深度SLAM features参数化可选、静止检测和零速矫正等功能。核心算法不依赖ROS,项目同时提供了单线程和ROS nodelet例程,分别采用Pangolin和Rviz两种可视化方式。在计算开销更低且无回环的情况下,在EuRoC等数据集上的定位精度与VINS-MONO-LOOP相当。

链接:

DockerHub链接

https://hub.docker.com/r/paopaorobot/larvio

GitHub链接:

https://github.com/PaoPaoRobot/docker_larvio

LARVIO原始链接:

https://github.com/PetWorm/LARVIO

上手指南:

这里提供一个简易的上手指南。由于是SLAM类项目,因此需要一些可视化工具来展示运行时的pangolin或者rviz效果。

本次提供的镜像中,已经配置好了VNC可视化的相关组件。以下是一套傻瓜教程:

(1)获得镜像

首先从DockerHub拉取镜像(宿主终端中执行):

docker pull paopaorobot/larvio

或利用Dockerfile进行本地构建(宿主终端中执行):

git clone \    https://github.com/PaoPaoRobot/docker_larvio.gitcd ./docker_larviodocker build -t paopaorobot/larvio .

(2)VNC可视化准备

下载与你电脑操作系统匹配的VNC Viewer,地址是:

https://www.realvnc.com/en/connect/download/viewer/

(3)下载数据集

LARVIO的例程提供了EuRoC数据集的演示程序。其中pangolin例程需求asl格式,ros nodelet例程需求bag格式,如果网速比较慢,建议下载最小的V102序列。下载地址是:

https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets

(4)创建container

我们假设你将V1_02的asl和bag都存放在宿主的YOUR_PATH_TO_EUROC/V1_02_medium路径下,执行下述命令实例化container:

docker run -itd -v \    YOUR_PATH_TO_EUROC/V1_02_medium:/root/Dataset/V1_02 \    -p 5900:5900 paopaorobot/larvio

该命令实例化了一个container并且将数据集挂载在container中的/root/Dataset路径下。

然后打开VNC Viewer,输入127.0.0.1:5900进行连接。如下图:

连接后可观察到如下界面:

(5)Pangolin例程

在VNC Viewer中,打开一个终端,执行下述命令:

cd /root/LARVIO/build./larvio \    /root/Dataset/V1_02/mav0/imu0/data.csv \    /root/Dataset/V1_02/mav0/cam0/data.csv \    /root/Dataset/V1_02/mav0/cam0/data \    ../config/euroc.yaml

即可直接运行LARVIO的pangolin例程,效果如下:

(6)ROS例程

在宿主机终端中,执行下述命令开启LARVIO节点:

docker exec -itd \    `docker ps | grep paopaorobot/larvio | awk '{print $1}'` \    /bin/bash -c \    'cd /root/LARVIO/ros_wrapper && \    . devel/setup.bash && \    roslaunch larvio larvio_euroc.launch'

然后在VNC Viewer中,打开一个终端,执行下述命令打开rviz可视化:

cd /root/LARVIO/ros_wrapper. devel/setup.bashroslaunch larvio larvio_rviz.launch

回到宿主机终端,执行下命令播放数据集:

docker exec -it \    `docker ps | grep paopaorobot/larvio | awk '{print $1}'` \    /bin/bash -c \    '. /opt/ros/melodic/setup.bash && \    rosbag play \    /root/Dataset/V1_02/V1_02_medium.bag'

此时可以在VNC中看到如下效果:

泡泡Docker乐园往期回顾:

【泡泡Docker乐园】手把手带你走进Docker世界

如果你对本文感兴趣,想要下载完整文章进行阅读,可以关注【泡泡机器人SLAM】公众号

点击阅读原文,即可获取本文相关资料。

【泡泡Docker乐园】Dockerfile简易教程 LARVIO镜像相关推荐

  1. Docker常见命令---简易教程

    容器相关操作 docker create # 创建一个容器但是不启动它 docker run # 创建并启动一个容器 docker stop # 停止容器运行,发送信号SIGTERM docker s ...

  2. Docker——使用Dockerfile制作java程序镜像

     1.准备制作镜像需要的jar包和java镜像 上传jar包到/home/docker目录下 拉取java镜像:docker pull java:8 2.在jar包同级目录下创建Dockerfile文 ...

  3. Docker使用Dockerfile脚本创建自定义镜像

    步骤: (1)创建目录 mkdir –p /usr/local/dockerjdk8 (2)下载jdk-8u171-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/d ...

  4. docker之Dockerfile指令介绍

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...

  5. Docker : Dockerfile 定制镜像

    使用 Dockerfile 定制镜像 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程.   镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们 ...

  6. Kubernetes学习笔记三:Docker安装,Docker使用,编写Dockerfile,制作容器镜像,上传docker镜像

    文章目录 Docker的安装 Docker的使用:docker run命令 查看本地存在的镜像:docker images命令 编写Dockerfile,制作容器镜像 docker build制作镜像 ...

  7. Docker学习(8)——构建镜像(Dockerfile、commit)

    前言 在前面的文章里我们已经详细介绍了构建镜像的两种常用方式,下面我们将具体看看如何实际操作,以及镜像的优化方式. 一.commit封装镜像 以ubuntu的镜像为例: 1.导入ubuntu镜像 [r ...

  8. Docker用Dockerfile定制镜像

    用Dockerfile定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那之前提示的无法重复的问题 ...

  9. Docker Review - dockerfile 实战_使用dockerfile制作tomcat镜像

    文章目录 Pre Docker 官方镜像 Dockerfile dockerfile制作tomcat镜像 准备软件 编写Dockerfile文件 dockerfile构建镜像 启动镜像 测试访问tom ...

最新文章

  1. 前谷歌董事长施密特:美国AI领导地位岌岌可危,科研预算投入得翻倍
  2. 死磕Java并发:J.U.C之AQS阻塞和唤醒线程
  3. python中安装一个第三方库的命令格式是-无法使用pip命令安装python第三方库的彻底解决方案...
  4. python各种数据类型的常用方法_python的基本数据类型:列表的方法
  5. 前端学习(563):干掉block重叠margin重叠
  6. excel怎么设置一个按钮就一点就生成一个表_条码生成软件如何批量生成DPD条码...
  7. Spring : Spring的ApplicationContext接口
  8. 模块调用时对参数值的更改
  9. MySQL中的事务及读写锁实现并发访问控制
  10. 《程序员情商》自我修养必备《论语》
  11. 熟练掌握计算机应用,计算机应用技术专业个人技能怎么写
  12. uc浏览器怎么播放html5,uc视频社区 手机UC浏览器不能看视频了怎么办?
  13. 智商决定能力和情商决定本事的分析
  14. springcloud5-服务网关zuul及gateway
  15. Git问题Everything up-to-date正确解决方法
  16. 手机、手环NFC刷门禁卡
  17. OKRs-E,转变只追求结果的旧观念
  18. 8421码、5421码、2421码、余三码
  19. Qt学习经验之quit()、exit()、close()
  20. 祖冲之号超导量子计算机,超导量子计算原型机“祖冲之号”有多强?带你了解“量子世界”...

热门文章

  1. JAVA 小程序 编程练习
  2. MongoDB中的字段类型Id
  3. 企业呼叫中心外包服务市场现状研究分析-
  4. Scratch习题—例2-画板(重绘撤销)
  5. 地理坐标系与投影坐标系简介
  6. 学习笔记:深度学习(8)——基于PyTorch的BERT应用实践
  7. Layui表格-复杂表头
  8. 用选择法对10个整数进行升序排序
  9. “AutoDraw”的智能画图软件 谷歌 --拯救不会画画的你:谷歌AutoDraw可智能修改简笔画
  10. 关于KEIL软件总是全编译的问题