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

2023-05-16

【泡泡Docker乐园】Dockerfile简易教程 & LARVIO镜像(亲测完美)

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

编辑:邱笑晨

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

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

感谢晨博,感谢泡泡机器人

文章目录

  • 【泡泡Docker乐园】Dockerfile简易教程 & LARVIO镜像(亲测完美)
    • 1、前言
    • 2、LARVIO项目镜像

1、前言

本期将简要的介绍利用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 kinetic
RUN 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指令的基本用法,更多指令和详细用法请参考官方文档:

官方文档

利用Dockerfile构建image

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

docker build -t IMG_NAME DOCKERFILE_PATH

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

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

2、LARVIO项目镜像

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

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

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

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

(1)获得镜像

注意:下载速度慢的话建议把docker源配置为阿里云源
首先从DockerHub拉取镜像(宿主终端中执行):

docker pull paopaorobot/larvio

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

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

注意后面.号。
(2)VNC可视化准备

下载与你电脑操作系统匹配的VNC Viewer,地址是:
VNC 下载连接
如果是ubuntu系统,选择DEB X64,然后使用

sudo dpkg -i *.deb

安装
在这里插入图片描述
(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:
注意把bag包也放在V1_02_medium下。

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.bash
roslaunch 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中看到如下效果:

在这里插入图片描述
点击阅读原文,即可获取本文相关资源。

欢迎来到泡泡论坛,这里有大牛为你解答关于SLAM的任何疑惑。

有想问的问题,或者想刷帖回答问题,泡泡论坛欢迎你!

泡泡网站:www.paopaorobot.org

泡泡论坛:http://paopaorobot.org/bbs/

泡泡机器人SLAM的原创内容均由泡泡机器人的成员花费大量心血制作而成,希望大家珍惜我们的劳动成果,转载请务必注明出自【泡泡机器人SLAM】微信公众号,否则侵权必究!同时,我们也欢迎各位转载到自己的朋友圈,让更多的人能进入到SLAM这个领域中,让我们共同为推进中国的SLAM事业而努力!

微信扫一扫 关注该公众号
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【泡泡Docker乐园】Dockerfile简易教程 & LARVIO镜像 的相关文章

  • ROS四旋翼无人机快速上手指南(1):无人机系统硬件概述与指南简介

    成就更好的自己 ROS无人机快速上手指南旨在于让使用此无人机开发平台的比赛参赛人员 xff0c 算法设计人员 xff0c 无人机爱好者更加快速的了解底层控制运作原理 xff0c 从而缩短开发周期 xff0c 减少掉坑次数 xff0c 快速验
  • ROS四旋翼无人机快速上手指南(2):Ubuntu18.04与ROS系统

    成就更好的自己 目录 Jetson版Ubuntu以及ROS的安装 xff1a ROS特性及Nano开发问题 PX4与Gazebo仿真环境 ROS与MATMAB仿真 Jetson版Ubuntu以及ROS的安装 xff1a ROS机器人系统运行
  • ROS四旋翼无人机快速上手指南(4):阿木实验室PX4功能包飞行控制分析与讲解(重点章节)

    成就更好的自己 这一章详细讲解一下阿木实验室 AMOV 的开源项目px4 command功能包 xff0c 此功能包通过mavlink协议直接控制烧录px4固件的自驾仪 xff0c 还融合了来自各个传感器的位姿 xff0c 距离等信息 xf
  • ROS四旋翼无人机快速上手指南(5):快速部署上层算法的操作与思路

    成就更好的自己 经过本系列上一篇文章关于PX4 command飞行控制功能包的分析 xff0c 相信大家对于飞整个流程有个大概的了解 xff0c 本章将在此基础上详细讲解一下应用级算法构建的思路与操作方法 关于PX4 command飞行控制
  • USB系列-LibUSB使用指南(1)-Windows下的报错与踩坑

    成就更好的自己 时隔一年再次开始撰写博客 xff0c 这一年的时间经历了很多 xff0c 现在终于稳定下来 以后很长一段时间都能够稳定的学习和更新 时间将会聚焦于USB和PCIe的开发进行 xff0c 能和大家共同进步真的很高兴 本篇为US
  • rosdep init和rosdep update出现问题解决,以及ros编程问题

    如果你在执行 rosdep init 过程中出现以下错误 ERROR cannot download default sources list from https raw githubusercontent com ros rosdist
  • linux内核体系结构

    本节介绍了linux内核的编制模式和体制结构 xff0c 然后详细描述linux内核代码目录中组织形式以及子目录各个代码文件的主要功能以及基本调用的层次关系 一个完整可用的操作系统主要由4部分组成 xff1a 硬件 操作系统内核 操作系统服
  • 基于OpenLTE的4G移动通信网络实验指导书

    基于本人本科毕业设计的成果 xff0c 设计了一套基于开源SDR项目 OpenLTE的实验指导书 xff0c 可以指引读者通过平台源码 平台提供的实验和结合实验对3GPP规范的解读分析来更直观 更多元立体的学习无线通信技术 xff0c 而不
  • 一行代码实现数组中数据频次值

    问题 xff1a 一行代码实现统计数组中每个name出现的次数 数组示例如下 xff1a 期望结果 xff1a 39 哈哈 39 2 39 哈哈1 39 1 39 哈哈2 39 2 span class token keyword var
  • mac bash_profile报错导致所有命令失效解决办法

    项目场景 xff1a 搭建flutter环境时 xff0c 在mac下需要配置环境变量 问题描述 xff1a 配置环境变量 xff0c 需要修改 bash profile文件 xff0c 修改文件保存退出后 发现文件有报错 xff0c 导致
  • 我理解的“大前端”

    前言 随着业务场景越来越复杂 xff0c 前端技术也越来越丰富 xff0c 这几年也迎来爆发期 xff0c 大前端 的概念逐渐涌现 本图根据本人理解整理 xff0c 如有不足 xff0c 欢迎指正 xff0c 感谢 一 终端 PC端 PC端
  • 前端获取用户地理定位的几种方式(Geolocation API,微信,腾讯地图)

    文章目录 前言一 Geolocation API二 微信 SDK1 引入jssdk2 获取签名 xff0c 注入配置3 调用JS SDK api 获取位置 三 第三方服务 xff08 腾讯地图服务 xff09 1 引入js文件2 获取定位
  • H5 软键盘自动搜索功能

    业务场景 xff1a 通常APP中的顶部搜索栏 xff0c 都配一个搜索按钮 同时输入文字软键盘弹起 xff0c 回车键自动变成搜索键 xff0c 点击软键盘中的搜索能进行搜索功能 xff0c 如下图taobao所示 xff1a 思考 软键
  • 基于vue-cli3构建自己的UI库

    文章目录 前言一 创建项目二 编写组件1 button组件2 引入字体图标icon文件3 引入Button组件看效果 三 修改目录结构1 packages文件夹2 打包修改2 demo展示 四 将UI库部署到npm上五 项目使用自己的UI库
  • vue3源码分析(三)—— 响应式系统(reactivity)

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言一 定义响应式数据1 reactive target 2 createReactiveObject2 1 入参2 2 响应式创建过程2 3 proxy
  • vue3源码分析(四)—— shared工具函数

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言1 数组中移除某元素2 字符串转数字3 转为字符串4 判定值是否发生改变5 判定数据类型5 1 数组5 2 Map5 3 Set5 4 Date5 5
  • 如何将两个rosbag包合并或者提取rosbag包中某些话题到一个rosbag里

    代码叫做merge bag py 运行的时候 python merge bag py v 1028msf bag msf bag vinReNoOutlier bag 就把msf bag和vinReNoOutlier bag完全合并在一起了
  • 解决 vscode中js变量 文件不能自动跳转问题~

    项目场景 xff1a 在项目开发中 xff0c 为了便于理解js代码逻辑和调试 xff0c 通常会使用快捷键自动定位到变量原始定义的文件位置 mac中快捷键 xff1a command 43 鼠标点击 但在vue项目开发中 xff0c 发现
  • vue3源码分析(二)—— 初始化流程

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言一 createApp在项目中的使用二 createApp源码追溯1 创建app实例1 1 ensureRenderer1 2 ensureRende
  • JS基础 ——解释执行

    文章目录 前言一 词法分析二 预编译创建全局作用域GO对象创建局部作用域AO对象 三 代码执行总结 前言 大家都知道 xff0c JS是一种不需要编译的解释型语言 但其实在浏览器执行JS代码前 xff0c 也有一个词法分析和预编译过程 xf

随机推荐

  • vue 项目中引入字体文件的正确方式~

    文章目录 前言一 开发中需要什么样的字体1 字体图标2 特殊字体 二 项目中引入字体文件1 字体文件2 css文件3 项目使用该字体 总结 前言 在UI设计稿中 xff0c 可能会有一些特殊字体 xff0c 或者是一些字体图标 对于特殊字体
  • vue3 使用 swiper轮播库

    文章目录 前言一 Swiper引入方式1 HTML标签引入方式2 CommonJs引入方式3 ES引入方式 xff08 采用 xff09 二 使用Swiper总结 前言 轮播图在前端开发中 xff0c 是常见需求 而Swiper库是最受前端
  • vue-cli2 老项目webpack3升级webpack5过程总结

    文章目录 背景一 webpack5环境要求二 升级步骤1 脚手架webpack cli2 升级webpack包3 更新webpack相关插件3 1 不推荐或被移除的插件3 2 升级babel到7版本3 3 更新插件 4 修改配置4 1 新增
  • 前端下载文件

    文章目录 前言二进制流前端核心实现下载功能有 xff1a 一 a标签 43 download属性二 window open url 34 blank 34 三 form表单四 接口请求 43 blob 43 a标签 43 download属
  • 前端JS 云打印 LODOP实践

    文章目录 前言一 Lodop是什么 xff1f 二 如何使用Lodop1 下载打印插件2 配置打印机3 html中植入打印控件4 调用Lodop对应的JS相关方法接口实现打印功能 三 Lodop主要方法接口三 注意点总结 前言 一般B S系
  • axios源码——工具函数utils.js

    文章目录 前言一 工具函数所在目录二 判定数据类型的函数1 isArray 判定数组 2 isString 判定字符串 3 isNumber 判定数值 4 isObject 判定对象 5 isPlainObject 判定纯对象 6 isUn
  • 源码阅读——validate-npm-package-name

    文章目录 前言一 源码阅读工具二 阅读源码1 目录结构2 package json3 index js 三 使用该包1 vue cli中使用2 create react app 中使用 总结 前言 validate npm package
  • 学习rtklib

    数据下载 日期转换和一些常用数据下载 http www gnsscalendar com index html year 61 2019 多系统精密星历和精密钟差下载 2021年10月25日更新 xff1a 单GPS精密星历文件要在这里下载
  • echarts 绘制多条折线图(横坐标,折线图条数不确定)

    项目场景 xff1a 使用echarts做业务图表统计 xff0c 记录一下在项目中图表接口返回的数据处理问题 需求描述 1 一个统计图中实现多条折现图的显示 xff0c 如下图所示 2 后台返回的数据结构 span class token
  • 线性二次型调节器(LQR)原理详解

    文章目录 前言算法解释代价函数的意义 推导过程可控性LQR控制实例参考资料 前言 LQR Linaer Quadratic Regulator xff0c 即线性二次型调节器 xff0c 是一种现代控制理论中设计状态反馈控制器 State
  • 嵌入式软件工程师常见面试问题

    嵌入式软件工程师面试题 1 stm32启动方式 xff1f 有三种 xff1a 从Flash启动 xff0c 将Flash地址0x0800 0000映射到0x00000000 这样启动以后就相当于从0x0800 0000开始的 xff0c
  • 使用python爬虫把自己的CSDN文章爬取下来并保存到MD文件

    导言 爬虫作为一个敏感技术 xff0c 千万要把握好 xff0c 如果人家不让爬那就不要头铁去试了 如何确定某个网站是否允许爬虫 在域名后面加上 robots txt查看即可 xff0c 例如 xff1a https blog csdn n
  • 寻找矩阵中的指定路径

    给定一个矩阵和一个要找的字符串 xff0c 如果有的话找出矩阵中的字符串路径 测试用例 功能测试 xff1a 在多行多列的矩阵中存在或者不存在路径 边界值测试 xff1a 矩阵只有一行或一列 xff1b 矩阵和路径中的所有字母都是相同的 特
  • Kalibr标定Intel D435i相机

    Kalibr标定Intel D435i相机 文章目录 Kalibr标定Intel D435i相机1 相机标定2 IMU标定3 相机 43 IMU联合标定4 标定结果评价 系统环境 xff1a ubuntu16 04 43 roskineti
  • VINS初始化

    VINS初始化 VINS初始化之外参在线标定 前面主要分析了外参标定出来旋转矩阵 xff0c 接下来接着分析初始化 if solver flag 61 61 INITIAL if frame count 61 61 WINDOW SIZE
  • ROS中关于两个话题时间同步遇到的问题 message_filters

    ROS中关于两个话题时间同步遇到的问题 message filters 参考链接 CMakeFiles imu data dir src imu data cpp o xff1a 在函数 message filters Synchroniz
  • ROS之多传感器融合算法实现

    ROS之多传感器融合算法实现 文章目录 1 motivation2 method2 1 订阅ROS的多个话题并对数据进行处理2 2 订阅ROS的多个话题并发布成一个话题 1 motivation IntelRealsenseD435i传感器
  • ignav代码阅读笔记

    整个代码还是根据rtklib进行改的 xff0c 功能很完善 xff0c 但是我主要只关注ppp ins紧组合 代码链接 https github com Erensu ignav 代码功能 可以完成ppp和ins的紧组合 xff0c 把c
  • 【泡泡Docker乐园】使用泡泡Docker基础镜像放心大胆地开发吧!

    泡泡Docker乐园 使用泡泡Docker基础镜像放心大胆地开发吧 xff01 2020 4 7 泡泡推广 amp 编辑组 泡泡Docker乐园 xff0c 带你进入Docker的狂欢派对 简介 xff1a 泡泡Docker乐园 本次将推出
  • 【泡泡Docker乐园】Dockerfile简易教程 & LARVIO镜像

    泡泡Docker乐园 Dockerfile简易教程 amp LARVIO镜像 亲测完美 简介 xff1a 泡泡Docker乐园 第二期来啦 xff01 本期我们将简要介绍使用Dockerfile进行image构建的方法 利用Dockerfi