ROS从入门到精通4-3:制作Docker镜像文件Dockerfile
目录
- 0 专栏介绍
- 1 为什么需要Dockerfile?
- 2 Dockerfile书写原则
- 3 Dockerfile常用指令
- 3.1 `FROM`
- 3.2 MAINTAINER
- 3.3 `RUN`
- 3.4 `ADD`
- 3.5 `COPY`
- 3.6 `CMD`
- 3.7 `ENV`
- 3.8 `EXPOSE`
- 3.9 `WORKDIR`
- 3.10 `ARG`
- 4 Dockerfile构建ROS工程实例
0 专栏介绍
本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。
🚀详情:《ROS从入门到精通》
1 为什么需要Dockerfile?
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。详细理解Dockerfile就是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

Dockerfile具有很多好处:
- 易于版本化管理:
Dockerfile本身就是一个文本文件,方便存放在代码仓库中进行版本管理,也方便查找各个版本之间的变更历史。- 无需考虑环境便于构建:使用
Dockerfile构建镜像不需要考虑构建环境,基于同一个Dockerfile,无论在哪里运行,构建结果都是一致的。- 过程可追溯:
Dockerfile中的每一行指令代表一个镜像层, 根据Dockerfile的内容,可以清晰的查看到镜像的完整构建过程。
2 Dockerfile书写原则
Dockerfile书写原则如下:
- 单一职责:容器的本质就是一个过程,不同功能的应用程序应该尽可能地划分到不同的容器中,每个容器只负责一个业务流程。
- 保持容器最小化:应该避免安装无用的软件包
- 合理选择基础镜像:容器的核心是应用,所以只要基础镜像可以满足应用的运行环境
尽量使用构建缓存:利用缓存,可以大大缩短镜像构建时间。
最小化镜像层数:在构建镜像时尽可能地减少Dockerfile指令行数。
3 Dockerfile常用指令
Docker以从上到下的顺序运行Dockerfile的指令,本节列出了一些常用的指令。
3.1 FROM
指定基础镜像,必须为第一个命令
-
格式
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]其中
tag是可选的,如果不使用则采用最新版本的基础镜像 -
例子
FROM osrf/ros:noetic-desktop-full
3.2 MAINTAINER
维护者信息
-
格式
MAINTAINER <name> -
例子
MAINTAINER Winter
3.3 RUN
用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行- 格式
RUN <shell-command> - 例子
RUN pip3 install setuptools
- 格式
exec执行- 格式
RUN ["executable", "param1", "param2"] - 例子
RUN ["/etc/execfile", "arg1", "arg2"]
- 格式
3.4 ADD
将本地文件添加到容器中,tar类型文件会自动解压,可以访问网络资源
-
格式
ADD [--chown=<user>:<group>] <src>... <dest> -
例子
# 相对路径,拷贝到WORKDIR目录下relativeDir/ ADD test.txt relativeDir/ # 绝对路径 ADD test.txt /absoluteDir/ # 更改权限 ADD --chown=55:mygroup files* /somedir/
3.5 COPY
COPY指令和ADD指令的唯一区别在于:是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。相同需求时,推荐使用COPY指令,ADD指令更擅长读取本地tar文件并解压缩或读取远程URL资源
3.6 CMD
类似于RUN指令,用于运行程序,但二者运行的时间点不同:CMD在构建镜像时不会执行,而在容器运行时运行;RUN则是在docker build时运行
- 格式
CMD <shell command> CMD [<exe>, <param1>, <param2>, ...] CMD [<param1>, <param2>, ...] - 例子
每个CMD ["/usr/bin/wc","--help"]Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行
3.7 ENV
设置环境变量
- 格式
ENV <env_key> <env_val> - 例子
ENV myName John Doe
3.8 EXPOSE
指定于外界交互的端口
- 格式
EXPOSE <port> [<port>/<protocol>...] - 例子
该EXPOSE 8080EXPOSE指令实际上并未发布端口。要在运行容器时实际发布端口,docker run -P来发布和映射一个或多个端口
3.9 WORKDIR
工作目录,类似于cd命令
- 格式
WORKDIR </path/to/workdir> - 例子
通过WORKDIR /a (这时工作目录为/a)WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行
3.10 ARG
定义变量,与ENV作用相同,不过ARG变量不会像ENV变量那样持久化到构建好的镜像中,也就是说只有docker build的过程中有效。构建命令docker build中可以用--build-arg <参数名>=<值>来覆盖。
- 格式
ARG <arg_key>[=<arg_val>] - 例子
ARG site ARG build_user=www
4 Dockerfile构建ROS工程实例
# Use the official ROS Noetic base image
FROM osrf/ros:noetic-desktop-full# Set the working directory
WORKDIR /project# Install additional dependencies if needed
RUN apt-get update \&& apt-get -y --no-install-recommends install \git \gcc \vim \psmisc \libxml2-dev \libxslt-dev \python3 \python3-pip \ python-is-python3\ros-noetic-amcl \ros-noetic-base-local-planner \ros-noetic-map-server \ros-noetic-move-base \ros-noetic-navfn# python packages
RUN pip3 install setuptools && pip3 install catkin-tools# bash
RUN echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc# Copy the project into the container
COPY . /project# catkin build
RUN /bin/bash -c '. /opt/ros/noetic/setup.bash; catkin_make'
🔥 更多精彩专栏:
- 《ROS从入门到精通》
- 《机器人原理与技术》
- 《机器学习强基计划》
- 《计算机视觉教程》
- …
相关文章:
ROS从入门到精通4-3:制作Docker镜像文件Dockerfile
目录 0 专栏介绍1 为什么需要Dockerfile?2 Dockerfile书写原则3 Dockerfile常用指令3.1 FROM3.2 MAINTAINER3.3 RUN3.4 ADD3.5 COPY3.6 CMD3.7 ENV3.8 EXPOSE3.9 WORKDIR3.10 ARG 4 Dockerfile构建ROS工程实例 0 专栏介绍 本专栏旨在通过对ROS的系统学习࿰…...
【CV】计算机视觉是什么?
计算机视觉是一门研究如何使机器“看”的学科,旨在实现从图像或视频中获取信息的技术和方法。它涵盖了图像处理、模式识别、机器学习等多个领域,是人工智能领域的重要分支之一。以下是计算机视觉的一般概要介绍: 概要介绍: 图像…...
如何在Vue中实现鼠标悬浮展示与隐藏弹窗的功能
如果你需要鼠标在元素和弹窗上时保持弹窗显示,而鼠标离开这两者时隐藏弹窗,你可以使用一个稍微复杂的逻辑来处理鼠标的进入和离开事件。 这通常涉及到延时关闭弹窗,以便给用户足够的时间从元素移动到弹窗上,而不触发弹窗关闭。以…...
03 Linux编程-进程
1、进程的相关概念 1.1 程序与进程 程序是静态的概念,进程是程序的一次运行活动。 1.2 查看系统中有哪些进程 ps #只显示一小部分进程 ps -aux #会打印当前所有进程 ps -aux|grep init #使用grep筛选出只含有init的进程top #运行显示的进程有点类似windows…...
Hbuild-X运行ios基座app
一、说明 ios真机第一次运行的时候需要下载插件,这个都是自动监测,自动下载的,不用多说。ios真机运行是需要签名的,不然就会报以下错误。如何制作免费的签名证书呢,需要借助爱思助手来完成。 二、安装爱思助手 &…...
Node.js基础:从入门到实战
初识 Node.js 与内置模块 (初识) 1、知道什么是node.js 2、知道node.js可以做什么 3、node.js 中js的组成部分 (内置模块) 4、用 fs 模块读写操作文件 5、使用 path 模块处理路径 6、使用http 模块写一个基本的web服务器 初识 N…...
考研408笔记总结~
目录 一.数据结构 二.计算机组成原理 三.操作系统 四.计算机网络 私以为边看视频,边做笔记会更专注些,大家需要自取。欢迎大家和我一起探讨考研的问题,包括不仅限于专业课,数学,英语等等......,想说什么…...
使用在线工具等方式下载推特视频
使用在线工具等方式下载推特视频 使用在线工具 Visit a Twitter video downloader website: Websites like twdown.net, twittervideodownloader.com, and savevideo.me offer services to download Twitter videos.Paste the Twitter video URL into the designated input bo…...
性能优化:几方面考虑
我们可以继续再考虑下关于性能优化,我们还能从哪些方面着手呢? 1. 代码层面: 使用更高效的数据结构和算法。使用缓存避免多次数据库交互减少不必要的计算和内存分配。利用并行和异步编程提高性能。使用性能分析工具定位和优化瓶颈。 2. We…...
学习大数据:论学习Spark的重要性
随着科技的不断发展,大数据已经成为了当今社会的热门话题。大数据技术的出现,为我们提供了处理海量数据的新方法,使得我们能够从这些数据中挖掘出有价值的信息。在众多的大数据处理框架中,Apache Spark无疑是最为出色的一种。本文…...
学习java第七十一天
DI:依赖注入 依赖注入是spring容器中创建对象时给其设置依赖对象的方式,比如给spring一个清单,清单中列出了需要创建B对象以及其他的一些对象(可能包含了B类型中需要依赖对象),此时spring在创建B对象的时候…...
Altium Designer PCB快捷键设置
6)PCB修改快捷键,并自定义工具栏 添加boardlayerset系统命令。 修改系统脚本, 在D:\Program Files\Altium\AD18\System下,找到advpcb.rcs文件,打开。 Tree MNPCB_LayerSets CaptionManage Layer Se&ts Popup Emp…...
玩转Matlab-Simscape(初级)- 08 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(案例实战)
** 玩转Matlab-Simscape(初级)- 08 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(案例实战) ** 目录 玩转Matlab-Simscape(初级)- 08 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&…...
vue嵌套路由
一、嵌套 children配置 1.父类路由 mymusic 2.子类路由 musicson 1.创建MusicSon组件 <template><div><p>从前和后来</p><p>唯一</p><p>运气来的似有若无</p></div> </template><script>export defaul…...
视频降噪算法 hqdn3d 原理分析
视频降噪 视频降噪是一种处理技术,旨在减少视频中的噪声,提高画面质量。噪声可能来自多种源头,包括摄像机的传感器、压缩算法、传输过程中的干扰等。降噪处理对于视频监控、视频会议、电影后期制作以及任何需要高画质输出的应用场景都非常重…...
Ansys Mechanical|屈曲分析技术
屈曲分析的基本概念 当受拉杆件的应力达到屈服极限或强度极限时,将引起塑性变形或断裂。这些是由于强度不足所引起的失效。 在工程中,我们会注意到当细长杆件受压时,表现出与强度失效完全不同的性质。当杆件受压超过某一临界值时࿰…...
【大模型微调】一文掌握7种大模型微调的方法
本篇文章深入分析了大型模型微调的基本理念和多样化技术,细致介绍了LoRA、适配器调整(Adapter Tuning)、前缀调整(Prefix Tuning)等多个微调方法。详细讨论了每一种策略的基本原则、主要优点以及适宜应用场景,使得读者可以依据特定的应用要求和计算资源限…...
MySQL表突然卡死,删、查操作加载不停解决办法
今天遇到了MySQL删表的时候卡死情况。然后通过网上查阅资料和项目组沟通,了解到了有多人同时对同一张表进行了操作。我和另一个同事同时进行了删除操作,然后另两位同时进行了查询操作,然后还有一位同事用dolphin调度,用datax采集数…...
Rust 标准库的结构及其模块路径
在 Rust 中,标准库提供了一组核心功能,以帮助开发者执行常见的编程任务。当使用这些功能时,我们需要通过特定的模块路径来引用它们。下面,我们将详细介绍 Rust 标准库的结构,并提供相应的 use 路径。 Rust 标准库模块…...
003_PyCharm的安装与使用
如果你正在学习PyQt,本系列教程完全可以带你入门直至入土。 所谓从零开始,就是从软件安装、环境配置开始。 不跳过一个细节,不漏掉一行代码,不省略一个例图。 IDE 开始学习一个编程语言,我们肯定是首先得安装好它&…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
