当前位置: 首页 > news >正文

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 8080
    
    EXPOSE指令实际上并未发布端口。要在运行容器时实际发布端口,docker run -P来发布和映射一个或多个端口

3.9 WORKDIR

工作目录,类似于cd命令

  • 格式
    WORKDIR </path/to/workdir>
    
  • 例子
    WORKDIR /a  (这时工作目录为/a)
    
    通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUNCMDENTRYPOINTADDCOPY等命令都会在该目录下执行

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&#xff1f;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的系统学习&#xff0…...

【CV】计算机视觉是什么?

计算机视觉是一门研究如何使机器“看”的学科&#xff0c;旨在实现从图像或视频中获取信息的技术和方法。它涵盖了图像处理、模式识别、机器学习等多个领域&#xff0c;是人工智能领域的重要分支之一。以下是计算机视觉的一般概要介绍&#xff1a; 概要介绍&#xff1a; 图像…...

如何在Vue中实现鼠标悬浮展示与隐藏弹窗的功能

如果你需要鼠标在元素和弹窗上时保持弹窗显示&#xff0c;而鼠标离开这两者时隐藏弹窗&#xff0c;你可以使用一个稍微复杂的逻辑来处理鼠标的进入和离开事件。 这通常涉及到延时关闭弹窗&#xff0c;以便给用户足够的时间从元素移动到弹窗上&#xff0c;而不触发弹窗关闭。以…...

03 Linux编程-进程

1、进程的相关概念 1.1 程序与进程 程序是静态的概念&#xff0c;进程是程序的一次运行活动。 1.2 查看系统中有哪些进程 ps #只显示一小部分进程 ps -aux #会打印当前所有进程 ps -aux|grep init #使用grep筛选出只含有init的进程top #运行显示的进程有点类似windows…...

Hbuild-X运行ios基座app

一、说明 ios真机第一次运行的时候需要下载插件&#xff0c;这个都是自动监测&#xff0c;自动下载的&#xff0c;不用多说。ios真机运行是需要签名的&#xff0c;不然就会报以下错误。如何制作免费的签名证书呢&#xff0c;需要借助爱思助手来完成。 二、安装爱思助手 &…...

Node.js基础:从入门到实战

初识 Node.js 与内置模块 &#xff08;初识&#xff09; 1、知道什么是node.js 2、知道node.js可以做什么 3、node.js 中js的组成部分 &#xff08;内置模块&#xff09; 4、用 fs 模块读写操作文件 5、使用 path 模块处理路径 6、使用http 模块写一个基本的web服务器 初识 N…...

考研408笔记总结~

目录 一.数据结构 二.计算机组成原理 三.操作系统 四.计算机网络 私以为边看视频&#xff0c;边做笔记会更专注些&#xff0c;大家需要自取。欢迎大家和我一起探讨考研的问题&#xff0c;包括不仅限于专业课&#xff0c;数学&#xff0c;英语等等......&#xff0c;想说什么…...

使用在线工具等方式下载推特视频

使用在线工具等方式下载推特视频 使用在线工具 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…...

性能优化:几方面考虑

我们可以继续再考虑下关于性能优化&#xff0c;我们还能从哪些方面着手呢&#xff1f; 1. 代码层面&#xff1a; 使用更高效的数据结构和算法。使用缓存避免多次数据库交互减少不必要的计算和内存分配。利用并行和异步编程提高性能。使用性能分析工具定位和优化瓶颈。 2. We…...

学习大数据:论学习Spark的重要性

随着科技的不断发展&#xff0c;大数据已经成为了当今社会的热门话题。大数据技术的出现&#xff0c;为我们提供了处理海量数据的新方法&#xff0c;使得我们能够从这些数据中挖掘出有价值的信息。在众多的大数据处理框架中&#xff0c;Apache Spark无疑是最为出色的一种。本文…...

学习java第七十一天

DI&#xff1a;依赖注入 依赖注入是spring容器中创建对象时给其设置依赖对象的方式&#xff0c;比如给spring一个清单&#xff0c;清单中列出了需要创建B对象以及其他的一些对象&#xff08;可能包含了B类型中需要依赖对象&#xff09;&#xff0c;此时spring在创建B对象的时候…...

Altium Designer PCB快捷键设置

6&#xff09;PCB修改快捷键&#xff0c;并自定义工具栏 添加boardlayerset系统命令。 修改系统脚本&#xff0c; 在D:\Program Files\Altium\AD18\System下&#xff0c;找到advpcb.rcs文件&#xff0c;打开。 Tree MNPCB_LayerSets CaptionManage Layer Se&ts Popup Emp…...

玩转Matlab-Simscape(初级)- 08 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(案例实战)

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 08 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&#xff08;案例实战&#xff09; ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 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 原理分析

视频降噪 视频降噪是一种处理技术&#xff0c;旨在减少视频中的噪声&#xff0c;提高画面质量。噪声可能来自多种源头&#xff0c;包括摄像机的传感器、压缩算法、传输过程中的干扰等。降噪处理对于视频监控、视频会议、电影后期制作以及任何需要高画质输出的应用场景都非常重…...

Ansys Mechanical|屈曲分析技术

屈曲分析的基本概念 当受拉杆件的应力达到屈服极限或强度极限时&#xff0c;将引起塑性变形或断裂。这些是由于强度不足所引起的失效。 在工程中&#xff0c;我们会注意到当细长杆件受压时&#xff0c;表现出与强度失效完全不同的性质。当杆件受压超过某一临界值时&#xff0…...

【大模型微调】一文掌握7种大模型微调的方法

本篇文章深入分析了大型模型微调的基本理念和多样化技术&#xff0c;细致介绍了LoRA、适配器调整(Adapter Tuning)、前缀调整(Prefix Tuning)等多个微调方法。详细讨论了每一种策略的基本原则、主要优点以及适宜应用场景&#xff0c;使得读者可以依据特定的应用要求和计算资源限…...

MySQL表突然卡死,删、查操作加载不停解决办法

今天遇到了MySQL删表的时候卡死情况。然后通过网上查阅资料和项目组沟通&#xff0c;了解到了有多人同时对同一张表进行了操作。我和另一个同事同时进行了删除操作&#xff0c;然后另两位同时进行了查询操作&#xff0c;然后还有一位同事用dolphin调度&#xff0c;用datax采集数…...

Rust 标准库的结构及其模块路径

在 Rust 中&#xff0c;标准库提供了一组核心功能&#xff0c;以帮助开发者执行常见的编程任务。当使用这些功能时&#xff0c;我们需要通过特定的模块路径来引用它们。下面&#xff0c;我们将详细介绍 Rust 标准库的结构&#xff0c;并提供相应的 use 路径。 Rust 标准库模块…...

003_PyCharm的安装与使用

如果你正在学习PyQt&#xff0c;本系列教程完全可以带你入门直至入土。 所谓从零开始&#xff0c;就是从软件安装、环境配置开始。 不跳过一个细节&#xff0c;不漏掉一行代码&#xff0c;不省略一个例图。 IDE 开始学习一个编程语言&#xff0c;我们肯定是首先得安装好它&…...

别再只盯着wx.login了!SpringBoot后端实战:用getPhoneNumber接口搞定小程序用户手机号绑定

微信小程序用户手机号绑定&#xff1a;SpringBoot后端深度实践指南 在当今移动互联网生态中&#xff0c;微信小程序已成为连接用户与服务的重要桥梁。对于需要强实名认证或直接触达用户的业务场景&#xff08;如电商交易、金融服务、政务办理等&#xff09;&#xff0c;仅依赖w…...

终极跨平台漫画阅读方案:nhentai-cross全平台使用指南

终极跨平台漫画阅读方案&#xff1a;nhentai-cross全平台使用指南 【免费下载链接】nhentai-cross A nhentai client 项目地址: https://gitcode.com/gh_mirrors/nh/nhentai-cross 你是否厌倦了在不同设备间切换漫画阅读应用&#xff1f;nhentai-cross正是为你量身定制…...

告别串口线!用STM32CubeMX配置USB-CDC虚拟串口,实现与电脑免驱动通信(附Win7驱动安装指南)

STM32虚拟串口革命&#xff1a;USB-CDC免驱动通信全实战指南 嵌入式开发调试过程中&#xff0c;最令人头疼的莫过于频繁插拔串口线导致的接口松动、接触不良问题。传统串口调试不仅占用宝贵的UART资源&#xff0c;还常常因为物理连接问题浪费大量调试时间。本文将彻底改变这一局…...

如何用Sunshine打造个人游戏云:终极自托管游戏串流解决方案

如何用Sunshine打造个人游戏云&#xff1a;终极自托管游戏串流解决方案 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾经梦想在任何设备上畅玩PC游戏&#xff1f;无论是想…...

终极指南:3步实现PotPlayer实时字幕翻译,外语视频无障碍观看

终极指南&#xff1a;3步实现PotPlayer实时字幕翻译&#xff0c;外语视频无障碍观看 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还…...

数据中心碳减排:工作负载迁移与服务器调度优化

1. 数据中心碳减排技术概述 在数字经济时代&#xff0c;数据中心作为信息基础设施的核心载体&#xff0c;其能源消耗和碳排放问题日益凸显。据统计&#xff0c;全球数据中心电力消耗已占全球总用电量的1-2%&#xff0c;且随着AI、云计算等技术的快速发展&#xff0c;这一比例仍…...

WipperSnapper+Adafruit IO:无代码物联网开发实战,从传感器到云端自动化

1. 项目概述与核心价值如果你和我一样&#xff0c;在物联网&#xff08;IoT&#xff09;项目初期&#xff0c;常常被复杂的嵌入式编程、网络协议和云平台对接搞得焦头烂额&#xff0c;那么今天分享的这个实战项目&#xff0c;或许能让你眼前一亮。我们这次不谈复杂的代码&#…...

基于Rust与Candle的AI推理引擎cria:简化大模型本地部署与优化

1. 项目概述&#xff1a;从“左移”到“创造”的AI推理引擎 最近在折腾AI模型本地部署和推理优化的朋友&#xff0c;可能都绕不开一个名字&#xff1a; cria 。这个由 leftmove 开源的项目&#xff0c;全称是“Cria: The AI Inference Engine”&#xff0c;直译过来就是“创…...

开源技能安全仪表盘:从架构解析到CI/CD集成的DevSecOps实践

1. 项目概述&#xff1a;一个面向技能开发者的安全仪表盘最近在折腾一些智能设备上的技能开发&#xff0c;发现一个挺普遍但容易被忽视的问题&#xff1a;我们花大量时间在功能实现和用户体验上&#xff0c;但技能本身的安全性评估&#xff0c;往往只能等到上线后&#xff0c;通…...

从零打造专业GitHub个人资料页:Markdown与动态集成实战指南

1. 项目概述与核心价值 在技术圈子里混了十几年&#xff0c;我越来越觉得&#xff0c;一个开发者的“数字门面”和代码能力同等重要。这个门面&#xff0c;很多时候就是你的GitHub主页。早些年&#xff0c;大家的GitHub个人页面就是个简单的仓库列表&#xff0c;加上一些贡献图…...