ROS从入门到精通4-3:制作Docker镜像文件Dockerfile

news2025/4/3 16:51:14

目录

  • 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从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot3.2.5+mybatis-plus导致启动报错

公司新的项目升级到了springboot3.x后&#xff0c;步步是坑&#xff0c;坑坑不同&#xff0c;各种疑难杂症层出不穷&#xff0c;让老中医也也苦不堪言&#xff0c;java的生态圈真让人无语&#xff0c;你们升级能不能认真些互相兼顾一下&#xff1f; 这次的项目用了springboot3…

Python自学之路--004:Python使用注意点(原始字符串‘r’\字符转换\‘wb’与‘w区别’\‘\‘与‘\\’区别)

目录 1、原始字符串‘r’ 2、字符转换问题 3、open与write函数’wb’与’w’区分 4、Python里面\与\\的区别 1、原始字符串‘r’ 以前的脚本通过Python2.7写的&#xff0c;通过Python3.12去编译发现不通用了&#xff0c;其实也是从一个初学者的角度去看待这些问题。 其中的\…

春风拂面,深入浅出:Bean 处理器揭秘 Spring Boot 启动之谜

春风拂面&#xff0c;深入浅出&#xff1a;Bean 处理器揭秘 Spring Boot 启动之谜 在 Spring Boot 开发中&#xff0c;Bean 处理器扮演着至关重要的角色&#xff0c;犹如幕后英雄般默默地为应用启动过程添砖加瓦。然而&#xff0c;对于许多开发者来说&#xff0c;Bean 处理器依…

文档分类FastText模型 (pytorch实现)

文档分类FastText FastText简介层次softmaxN-gram特征FastText代码&#xff08;文档分类&#xff09; FastText简介 FastText与之前介绍过的CBOW架构相似&#xff0c;我们先来会议一下CBOW架构&#xff0c;如下图&#xff1a; CBOW的任务是通过上下文去预测中间的词&#xff0…

项目管理重点及笔记【太原理工大学24年】

为了自己复习写的&#xff0c;可能会有不清楚&#xff0c;可以选择性看可以讨论&#xff0c;但别骂我写的什么烂东西&#xff0c;&#xff0c;&#xff0c;&#xff08;电脑看排版更好看些&#xff09; 目录 一、IT项目管理概述 二、IT项目组织环境与管理过程 三、整体管理 四、…

使用httpx异步获取高校招生信息:一步到位的代理配置教程

概述 随着2024年中国高考的临近&#xff0c;考生和家长对高校招生信息的需求日益增加。了解各高校的专业、课程设置和录取标准对于高考志愿填报至关重要。通过爬虫技术&#xff0c;可以高效地从各高校官网获取这些关键信息。然而&#xff0c;面对大量的请求和反爬机制的挑战&a…

【汇编】算术指令

一、加法指令 &#xff08;一&#xff09;各加法指令的格式及操作 加法指令可做字或字节运算 &#xff08;1&#xff09;加法指令 ADD 格式&#xff1a;ADD DST,SRC执行的操作&#xff1a;(DST) ← (SRC)(DST) &#xff08;2&#xff09;带进位加法指令 ADC 格式&#xf…

【C语言】自定义类型之---结构体超详解(结构体的定义使用、指针结构体,内存对齐,......代码详解)

目录 前言&#xff1a; 一&#xff1a;结构体 1.1&#xff1a;什么是结构体&#xff1f; 1.2&#xff1a;结构体类型的声明 1.3&#xff1a;结构体变量的定义 1.4&#xff1a;结构体的内存对齐 1.5&#xff1a;结构体传参 二&#xff1a;位段 2.1&#xff1a;位段是什…

反爬-简单滑块思路,秒了~

文章目录 找图片的返回包curl 大法获取图片链接ddddocr分析距离看结果秒了~ 本文仅供参考学习&#xff0c;如有侵权&#xff0c;请联系作者删。 目标地址&#xff1a;aHR0cHM6Ly9pZHMuZ2RpdC5lZHUuY24vYXV0aHNlcnZlci9sb2dpbj9zZXJ2aWNlPWh0dHBzOi8vd2JkdC5nZGl0LmVkdS5jbi9zaG…

2024 Google I/O Android 相关内容汇总

2024 Google I/O Android 相关内容汇总 本次 Google I/O 的核心虽然是 AI &#xff0c;但是 Android 也是作为主要议题出现&#xff0c; Android 部分可以简单分为产品和开发相关内容&#xff0c;接下来主要介绍这两部分的相关更新。 重点开始开发相关&#xff0c;内容不少 产…

2010-2024年各地级市社会信用体系建设匹配DID数据

2010-2024年各地级市社会信用体系建设匹配DID数据 1、时间&#xff1a;2010-2024年 2、指标&#xff1a;行政区划代码、年份、所属省份、地区、社会信用体系建设示范区 3、范围&#xff1a;310个地级市 4、来源&#xff1a;国家发改委 5、指标解释&#xff1a; 社会信用体…

webpack优化构建速度示例-babel-loader开启缓存cacheDirectory:

babel-loader 默认并没有开启缓存。尽管babel-loader有自己的缓存机制&#xff0c;但它并不与webpack的缓存机制相冲突。相反&#xff0c;它们可以协同工作&#xff0c;以提供最佳的构建性能。 src/index.js import {otherSomeFuction} from ./module; console.log(otherSomeF…

LeetCode322:零钱兑换

题目描述 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无…

Kotlin核心编程知识点-02-面向对象

文章目录 1.类和构造方法1.1.Kotlin 中的类及接口1.1.1.Kotlin 中的类1.1.2.可带有属性和默认方法的接口 1.2.更简洁地构造类的对象1.2.1.构造方法默认参数1.2.2.init 语句块1.2.3.延迟初始化&#xff1a;by lazy 和 lateinit 1.3.主从构造方法 2.不同的访问控制原则2.1.限制修…

24长三角A题思路+分析选题

需要资料的宝子们可以进企鹅获取 A题 问题1&#xff1a;西湖游船上掉落华为 mate 60 pro 手机 1. 手机掉落范围分析 物品特征&#xff1a;华为 mate 60 pro 手机的尺寸、重量、形状等特性。静水假设&#xff1a;西湖水面平静&#xff0c;不考虑水流影响。掉落位置&#xff…

多态:解锁面向对象编程的无限可能

1. 概述 多态&#xff08;Polymorphism&#xff09;是面向对象编程的三大核心特性之一&#xff08;另两个是封装和继承&#xff09;。多态意味着不同的对象对同一消息做出不同的响应。简单来说&#xff0c;多态允许你使用父类引用指向子类对象&#xff0c;并且当调用方法时&am…

Jmeter使用While控制器

1.前言 对于性能测试场景中&#xff0c;需要用”执行某个事物&#xff0c;直到一个条件停止“的概念时&#xff0c;While控制器控制器无疑是首选&#xff0c;但是在编写脚本时&#xff0c;经常会出现推出循环异常&#xff0c;获取参数异常等问题&#xff0c;下面总结两种常用的…

如何看待Agent的爆火

在2023年3月&#xff0c;一个名为AutoGPT的框架项目引发了一场AI Agent热潮。这个项目利用大型语言模型&#xff0c;将大任务拆分成小任务&#xff0c;并使用工具完成它们。这种技术将大语言模型处理语言、创造内容和逻辑推理的能力扩展到了应用场景中&#xff0c;还加入了感知…

代码随想录——填充每个节点的下一个右侧节点指针 II(Leetcode117)

题目链接 层序遍历 /* // Definition for a Node. class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val _val;}public Node(int _val, Node _left, Node _right, Node _next) {val _val;left _l…

Android setMaxLifecycle和BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT浅析

前言 最近公司动荡&#xff0c;我在的项目受大环境影响收益每年下滑&#xff0c;可能要领盒饭了&#xff0c;所以最近都在复习相关基础内容&#xff0c;毕竟小脑袋瓜会忘记以前学过的东西。 在ViewPager和Fragment的懒加载中&#xff0c;具体的原理是怎么样的呢&#xff1f;为…