使用Dockerfile创建镜像

2023-05-16

Dockerfile是一个文本格式的配置文件,可以使用Dockerfile来快速创建自定义的镜像。

一、基本结构

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。一般而言,Dockerfile主体内容分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行命令。下面是一个简单的例子:

# escape=\ (backslash)
# This dockerfile uses the ubuntu:xeniel image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..

# Base image to use, this must be set as the first line
FROM ubuntu:xeniel

# Maintainer: docker_user <docker_user at email.com> (@docker_user)
LABEL maintainer docker_user<docker_user@email.com>

# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ xeniel main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Commands when creating a new container
CMD /usr/sbin/nginx

首行可以通过注释来指定解析器命令,后续通过注释说明镜像的相关信息。主体部分首先使用FROM指令指明所基于的镜像名称,接下来一般是使用LABEL指令说明维护者信息。后面则是镜像操作指令,例如RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像添加新的一层并提交。最后是CMD指令,来指定运行容器时的操作指令。

下在是Docker Hub上两个热门镜像nginx和Go的Dockerfile的例子,通过这两个例子可以对Dockerfile结构有个基本的认识。

第一个例子是在debain:jessie基础镜像上安装Nginx环境,从而创建一个新的nginx 镜像:

FROM debian:jessie

LABEL maintainer docker_user<docker_user@email.com>

ENV NGINX_VERSION 1.10.1-1~jessie

RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \
        && echo "deb http://nginx.org/packages/debian/ jessie nginx" >> /etc/apt/sources.list \
        && apt-get update \
        && apt-get install --no-install-recommends --no-install-suggests -y \
                                                ca-certificates \
                                                nginx=${NGINX_VERSION} \
                                                nginx-module-xslt \
                                                nginx-module-geoip \
                                                nginx-module-image-filter \
                                                nginx-module-perl \
                                                nginx-module-njs \
                                                gettext-base \
        && rm -rf /var/lib/apt/lists/*

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
        && ln -sf /dev/stderr /var/log/nginx/error.log

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

第二个是基于buildpack-deps:jessie-scm基础镜像,安装Golang相关环境,制作一个Go语言的运行环境镜像:

FROM buildpack-deps:jessie-scm

# gcc fo cgo
RUN apt-get update && apt-get install -y --no-install-recommends g++ gcc libc6-dev make && rm -rf /var/lib/apt/lists*

ENV GOLANG_VERSION 1.6.3
ENV GOLANG_DOWNLOAD_RUL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
ENV GOLANG_DOWNLOAD_SHA256 cdd5e08530c0579255d6153b08fdb3b8e47caabbe717bc7bcd7561275a87aeb

RUN curl -fssL "$GOLANG_DOWNLOAD_RUL" -o golang.tar.gz && \
echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - && tar -C /usr/local -xzf golang.tar.gz && rm golang.tar.gz

ENV GOPATH $GOPATH/bin:/usr/local/go/bin:$PATH

RUN mkdir -p "$GOPATH/bin" && chmod -R 777 "$GOPATH"
WORKDIR $GOPATH

COPY go-wrapper /usr/local/bin

二、指令说明

Dockerfile中指令的一般格式为INSTRUNCTION arguments,包括配置指令(配置镜像信息)和操作指令(具体执行操作),如下:

分类指令说明
配置指令ARG定义创建镜像过程中使用的变量
FROM指定所创建镜像的基础镜像
LABEL为生成的镜像添加元数据标签信息
EXPOSE声明镜像内服务监听的端口
ENV指定环境变量
ENTRYPOINT指定镜像的默认入口命令
VOLUME创建一个数据卷挂载点
USER指定运行容器时的用户名或UID
WORKDIR配置工作目录
ONBUILD创建子镜像时指定自动执行的操作指令
STOPSIGNAL指定退出的信号值
HEALTHCHECK配置启动容器如何进行健康检查
SHELL指定默认shell类型
操作指令RUN运行指定命令
CMD启动容器时指定默认执行的命令
ADD添加内容到镜像
COPY复制内容到镜像

2.1、配置指令

2.1.1 ARG

定义创建镜像过程中使用的变量,格式为 ARG <name> [=<default value>]。

在执行docker build时,可以通过-build-arg[=] 来为变量复制。当镜像编译成功后,ARG指令的变量将不再存在(ENV指定的变量将在镜像中保留)。

Docker内置了一些镜像创建变量,用户可以直接使用而无需声明,包括HTTP_PROXY、HTTPS_PROXY、FTP_PROXY、NO_PROXY(不区分大小写)。

21.2 FROM

指定所创建镜像的基础镜像。格式为FROM <image> [AS name]或FROM <image>:<tag> [AS <name>]或FROM <image>@<digest> [AS <name>]。

任何Dockerfile中第一条指令必须为FROM指令,并且如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。

为了保证镜像精简,可以使用体积较小的镜像作为基础镜像,比如Alpine或Debian。例如:

ARG VERSION=9.3
FROM debian:${VERSION}

2.1.3 LABEL

LABEL指令可以为生成的镜像添加元数据标签信息,这些信息可以用来辅助过滤出特定镜像。格式为LABEL <key>=<value> <key>=<value>......。

例如:

LABEL version="1.0.0-rc3"
LABEL author="wuychn@github" date="2019-03-03"
LABEL description="This text illustrates that label-values can span multiple lines."

2.1.4 EXPOSE

声明镜像内服务监听的端口。格式为EXPOSE <port> [<port>/<protocol>...]。例如:

EXPOSE 22 80 8443

该指令只是起到声明的作用,并不会自动完成端口映射。如果端口要映射出来,在启动容器时可以使用-P参数(Docker主机会自动分配一个宿主机的临时端口)或-p HOST_PORT:CONTAINER_PORT参数(具体指定所映射的本地端口)。

2.1.5 ENV

指定环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在。格式为ENV <key> <value>或ENV <key>=<value>...。例如:

ENV APP_VERSION=1.0.0
ENV APP_HOME=/usr/local/app
ENV PATH $PATH:/usr/local/bin

指令指定的环境变量在运行时可以被覆盖掉,如docker run --env <key>=<value> built_image。

当一条ENV指令中同时为多个环境变量赋值并且值也是从环境变量读取时,会为变量都赋值后再更新。如下面的指令,最终结果为key1=value1,key2=value2。

ENV key1=value2
ENV key1=value1 key2=${key1}

2.1.6 ENTRYPOINT

指定镜像的默认入口命令,该命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数。支持两种格式:

ENTRYPOINT ["executable","param1","param2"]:exec调用执行。

ENTRYPOINT command param1 param2:shell中执行。

此时,CMD指令指定值将作为根命令的参数。

每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效。在运行时,可以被--entrypoint参数覆盖掉,如:

docker run --entrypoint

2.1.7 VOLUME

创建一个数据卷挂载点。格式为VOLUME ["/data"]。

运行容器时可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保持的数据等。

2.1.8 USER

指定运行容器时的用户名或UID,后续的RUN等指令也会使用指定的用户身份。格式为USER deamon。

当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在Dockerfile中创建所需要的用户。例如:

RUN groupadd -r postgress && useradd --no-log-init -r -g postgres postgres

要临时获取管理员权限可以使用gosu命令。

2.1.9 WORKDIR

为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。格式为WORKDIR /path/to/workdir。

可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

最终输出为/a/b/c。

2.1.10 ONBUILD

指定当基于所生成镜像创建子镜像时,自动执行的操作指令。格式为ONBUILD [INSTRUCTION]。

例如,使用如下的Dockerfile创建父镜像ParentImage,指定ONBUILD指令:

# Dockerfile for ParentImage
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

使用docker build命令创建子镜像ChildImage时(FROM ParentImage),会首先执行ParentImage中配置的ONBUILD指令:

# Dockerfile for ChildImage
FROM ParentImage

等价于在ChildImage的Dockerfile中添加了如下指令:

ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

2.1.11 STOPSIGNAL

指定所创建镜像启动的容器接收退出的信号值:

STOPSIGNAL signal

2.1.12 HEALTHCHECK

配置所启动容器如何进行健康检查。有两种格式:

HEALTHCHECK [OPTIONS] CMD command:根据所执行命令的返回值是否为0来判断;

HEALTHCHECK NONE:禁止基础镜像中的健康检查。

OPTIONS支持如下参数:

-interval=DURATION:多久检查一次,默认30秒;

-timeout=DURATION:每次检查等待结果的超时时间,默认30秒;

-retries=N:失败的重试次数。

2.1.13 SHELL

指定其他命令使用shell时的默认shell类型:

SHELL ["executable", "parameters"]

默认值为 ["/bin/sh", "-c"]。

2.2、操作指令

2.2.1 RUN

运行指定命令。格式为RUN <command>或RUN <"executable", "param1", "param2">。后者会被解析为JSON数组,因此必须用双引号。前者默认在shell终端中运行命令,即/bin/sh -c,后者则使用exec执行,不会启动shell环境。

指定使用其他终端类型可以使用第二种方式实现,例如RUN ["/bin/bash", "-c", "echo hello"]。

每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像层。当命令较长时可以使用\来换行。

2.2.2 CMD

用于指定启动容器时默认执行的命令。有三种格式:

CMD ["executable", "param1", "param2"]:相当于执行executale param1 param2,推荐;

CMD command param1 param2:在默认的shell中执行,提供给需要交互的应用。

CMD ["param1", "param2"]:提供给ENTRYPOINT的默认参数。

每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。

如果启动容器时指定了运行的命令(作为run命令的参数),则会覆盖掉CMD指定的指令。

2.2.3 ADD

添加内容到镜像。格式为 ADD <src> <dest>。

该指令将复制指定的<src>路径下的内容到容器的<dest>路径下。其中<src>可以是Dockerfile所在目录的相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件(自动解压为目录)。<dect>可以是镜像内绝对路径,或者相对于工作目录(WORKDIR)的相对目录。

路径支持正则格式,例如:

ADD *.c /code/

2.2.4 COPY

复制内容到镜像。格式为 COPY <src> <dest>。

复制主机本地的<src>(为Dockerfile所在目录的相对路径,文件或目录)下内容到镜像中的<dest>。目标路径不存在时会自动创建。

路径同样支持正则格式。

三、创建镜像

编写完Dockerfile文件后,可以通过docker build命令来创建镜像,该命令的格式为:

root@ubuntu:~# docker build --help

Usage:  docker build [OPTIONS] PATH | URL | -

Build an image from a Dockerfile

Options:
      --add-host list           Add a custom host-to-IP mapping (host:ip)
      --build-arg list          Set build-time variables
      --cache-from strings      Images to consider as cache sources
      --cgroup-parent string    Optional parent cgroup for the container
      --compress                Compress the build context using gzip
      --cpu-period int          Limit the CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int           Limit the CPU CFS (Completely Fair Scheduler) quota
  -c, --cpu-shares int          CPU shares (relative weight)
      --cpuset-cpus string      CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string      MEMs in which to allow execution (0-3, 0,1)
      --disable-content-trust   Skip image verification (default true)
  -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')
      --force-rm                Always remove intermediate containers
      --iidfile string          Write the image ID to the file
      --isolation string        Container isolation technology
      --label list              Set metadata for an image
  -m, --memory bytes            Memory limit
      --memory-swap bytes       Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --network string          Set the networking mode for the RUN instructions during build (default "default")
      --no-cache                Do not use cache when building the image
      --pull                    Always attempt to pull a newer version of the image
  -q, --quiet                   Suppress the build output and print image ID on success
      --rm                      Remove intermediate containers after a successful build (default true)
      --security-opt strings    Security options
      --shm-size bytes          Size of /dev/shm
  -t, --tag list                Name and optionally a tag in the 'name:tag' format
      --target string           Set the target build stage to build.
      --ulimit ulimit           Ulimit options (default [])

该命令会读取指定路径下(包括子目录)的Dockerfile文件,并将该路径下所有数据作为上下文(Context)发送给Docker服务端。Docker服务端在校验Dockerfile格式通过后,逐条执行其中定义的指令,碰到ADD、COPY和RUN指令会生产一层新的镜像。最终如果创建镜像成功,会返回最终镜像的id。

如果上下文过大,会导致发送大量数据给服务端,延缓创建过程,因此除非是生成镜像必须的文件,不然不要放到上下文路径下。如果使用非上下文路径的Dockerfile,可以通过-f选项来指定其路径。

要指定生成镜像的标签信息,可以通过-t选项。该选项可以重复使用多次为镜像一次添加多个名称。

例如,上下文路径为/tmp/docker_builder,并且希望生成镜像标签为build/first_image:1.0.0,可以使用下面的命令:

docker build -t builder/first_image:1.0.0 /tmp/docker_builder/

3.1、选择父镜像

大部分情况下,生成新的镜像都需要通过FROM指令来指定父镜像。父镜像是生成镜像的基础,会直接影响生成的镜像的大小和功能。

可以选择两种镜像作为父镜像,一种是所谓的基础镜像(baseimage),另外一种是普通的镜像(往往由第三方创建,基于基础镜像)。

基础镜像比较特殊,其Dockerfile中往往不存在FROM指令,或者基于scrath镜像(FROM scratch),这意味着其在整个镜像树中处于根的位置。

下面的Dockerfile定义了一个简单的基础镜像,将用户提前编译好的二进制可执行文件binary复制到镜像中,运行容器时执行binary命令:

FROM scratch
ADD binary
CMD ["/binary"]

普通镜像也可以作为父镜像使用,包括常用的busybox、debian、ubuntu等。

3.2、使用.dockerignore文件

可以通过在.dockerignore文件(每一行添加一条匹配模式)来让Docker忽略匹配路径或文件,在创建镜像时不将无关数据发送到服务端。

例如,下面的例子中包含了6行忽略的模式:

*/tmp*
*/*/temp*
tmp?
~*
DockerFile
!README.md

Dockerfile文件中模式语法支持Golang风格的路径正则格式:

*表示任意多个字符;

?表示单个字符;

!表示不匹配(即不忽略指定的路径或文件)。

3.3、多步骤创建

自17.05版本开始,Docker支持多步骤(multi-stage build)特性,可以精简最终生成的镜像大小。

对于需要编译的应用(C、Java等),通常至少需要准备两个环境的Docker镜像:

1)、编译环境镜像:包括完整的编译引擎、依赖库等,往往比较庞大,作用是编译应用为二进制文件。

2)、运行环境镜像:利用编译好的二进制文件,运行应用,由于不需要编译环境,体积比较小。

使用多步骤创建,可以在保证最终生成的运行环境镜像保持精简的情况下,使用单一的Dockerfile,降低维护复杂度。

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

使用Dockerfile创建镜像 的相关文章

  • Windows中公用网络与专用网络的区别

    当我们第一次打开一个Windows网络应用程序时 xff0c 会弹出选择网络类型 xff1a 专用网络 xff0c 公用网络 这个的确令人费解 xff0c 相信很多人都不知所措过 有的人干脆都选上 xff0c 这样就避免了被防火墙挡住 这里
  • ubuntu服务器修改ssh登录用户名及端口

    1 如果默认的ssh登录用户名为ubuntu xff0c 需要开通root账户 xff0c 添加密码 xff1a passwd root 还需修改配置 xff0c 具体方法 xff1a vi etc ssh sshd config 确保一下
  • 针对Android MediaCodec解码延时问题的替代解决方案

    如题 xff0c 本人在jni层实现了avc hevc的解码 xff0c 避免了在java上层调用系统的MediaCodec解码出现的延时问题 xff0c 完美支持1080P xff0c 4K xff08 具体看手机性能 xff09 xff
  • 系统环境变量path的列表不见了

    如题 xff0c 在编辑系统环境变量时 xff0c 发现path的环境变量原先是列表显示的 xff0c 看起来比较清晰 xff0c 而现在变成了一个文本框了 xff0c 就不那么一目了然了 于是在网上找到下面这个文章 xff0c 能很好解决
  • gazebo(1):gazebo常见问题及解决办法

    目录 1 将自己创建的gazebo模型导入后 xff0c 模型不停得抖动 xff0c 翻转 2 save world as 之后卡死 3 下载gazebo官方模型 xff1a 4 gazebo更新后无法打开 5 运行gazebo后报错 6
  • Makefile中的$(1)是什么

    Linux工程的编译要用到make工具 xff0c 平台不一样 xff0c 只是工具链不同 xff0c 但Makefile是编译系统的关键所在 xff0c 因此掌握Makefile的编写规则是非常重要的 尽管有了cmake这样更容易使用的编
  • gl的矩阵模式及其相应的矩阵变换函数

    以Android的GL10为例 xff0c 说明一下矩阵模式及其相应的矩阵变换函数 矩阵模式一共分为两种 xff1a gl glMatrixMode GL10 GL MODELVIEW 和 gl glMatrixMode GL10 GL P
  • 对md5sum程序的修改

    linux下自带md5sum工具 xff0c 可以对文件计算md5值 xff0c 但这个命令行工具不能直接对字符串求md5 xff0c 而对一个字符串求md5是一个比较有用的需求 xff0c 比如计算签名 于是对源码md5sum c修改了一
  • 物联网通信协议——比较-MQTT、 DDS、 AMQP、XMPP、 JMS、 REST、 CoAP

    原文链接 xff1a https blog csdn net lightrain0 article details 84343857 AMQP amp MQTT amp DDS https www youtube com watch v 6
  • 门电路逻辑符号大全(三态门,同或门,异或门,或非门,与或非门, 传输门,全加器,半加器等)

    最近要研究一下滤波器设计的无乘法器的实现 xff0c 所以要学习一下加法器的电路 xff0c 丢了一段时间 xff0c 忘的差不多了 xff0c 这里罗列一下常用的门电路的符号 这是一个1位全加器的数字电路组成 xff1a 以下两幅图可以复
  • 实函数傅里叶变换的奇偶虚实特性

    本文内容来源于他人的PPT xff0c 经本人整理而成 xff0c 算是对数字信号处理的复习吧 而实偶函数的傅里叶变换仍然是一个实偶函数的性质正是DCT的基础 xfeff xfeff
  • 多面体及欧拉公式及广义欧拉公式

    像正方体 xff0c 四棱锥这样的平面多面体属于简单多面体 xff0c 它们可以与球拓扑同构 xff0c 即可以连续拓扑变换成一个球 它们满足欧拉公式 xff1a v e 43 f 61 2 其中v是顶点 xff08 vertex xff0
  • mysql在表的某一位置增加一列的命令

    如果想在一个已经建好的表中添加一列 xff0c 可以用诸如 xff1a alter table t1 add column addr varchar 20 not null 这条语句会向已有的表t1中加入一列addr xff0c 这一列在表
  • tar命令中的-C作用

    tar xzvf abc tar gz C tmp 上面的命令将abc tar gz这个压缩包解压到当前目录下的tmp目录下 xff0c 而不是当前目录下 xff0c 这就是 C选项的作用
  • Java多线程

    一 基础概念 1 CPU核心数和线程数 多核心指的是单芯片多处理器 xff0c 将多个CPU集成到同一个芯片内 xff0c 不同的CPU可以单独的运行程序 目前主流的CPU有四核 六核 八核 增加核心数目的是为了增加线程数 xff0c 一般
  • ros(23):接收rviz中的2D Nav Goal、2D Pose Estimate消息

    1 rviz 教程 1 1 2D Nav Goal 2D Nav Goal Keyboard shortcut g This tool lets you set a goal sent on the 34 goal 34 ROS topic
  • RealSense SR300 坑4米 获取相机参数

    硬件 相机的原理我了解的也不甚多 xff0c 看到一篇讲的很好的文章 xff0c 就在这里引用了 SR300设备的红外线发射器 xff08 IR Laser Projector xff09 发射的 结构光 xff0c 经物体反射后会被红外线
  • 算法的分类

    算法有多种分类方式 xff0c 可以根据实现方式分类 xff0c 也可以根据设计方法分类 xff0c 还可以根据应用领域进行分类 不同的分类方式有不同的特点 按照实现方式分类 xff0c 可以将算法分为递归算法 迭代算法 逻辑算法 串行算法
  • Eclipse搭建stm32+jlink开发环境全攻略(进阶篇二)

    Eclipse搭建stm32 43 jlink开发环境全攻略 进阶篇 二 我们设计程序往往会遇到这样的一个需求 xff0c 那就是我们的程序起始位置需要重新定位 xff0c 并不是默认的0x08000000 xff0c 这种情况往往出现在有
  • 不要在小公司做底层软件开发

    在这里makekam对底层软件的理解就是指驱动开发 xff0c 代码移植等工作 其中也包括底层的算法 在小公司做软件不要做底层软件开发 xff0c 犹如在公司做硬件开发不要只是焊接电路板 小公司处于产业链的最末端 xff0c 没有自己的核心

随机推荐

  • 多旋翼飞控篇新手课堂教程(共九集)

    多旋翼飞控篇新手课堂第一课 xff0c 将你的NAZA M真正升级成NAZA V2 http www mxkong com thread 134 1 1 html 出处 模型控MxKong 多旋翼飞控篇新手课堂第二课 xff1a NAZA远
  • Java基础final详解

    final中文意思 最后的 最终的 final 可以修饰类 属性 方法和局部变量 1 当不希望类被继承时 可以用final修饰 final class A 不可被继承 2 当不希望父类的某个方法被子类覆盖 重写 override 时 可以用
  • socket编程总结

    socket编程总结 主机字节序和网络字节序 字节序分为大端字节序 xff08 big endian xff09 和小端字节序 xff08 little endian xff09 大端字节序 xff1a 一个整数的高位存在内存的底地址 xf
  • c++中的常见问题

    CSP J终于考完了啊 xff01 坐在考场 xff0c 是一种煎熬 xff1a 为什么那么多不会啊 xff01 xff01 xff01 这里 xff0c 总结一下在c 43 43 中的那些常见问题 xff08 作者亲身经历 xff09 x
  • 大陆毫米波雷达ARS408-21xx(内附毫米波雷达使用说明书)使用记录:第一期

    文章目录 前言一 硬件链接二 代码如何使用三 大陆毫米波雷达ARS408 21XX解析代码说明总结 前言 从我个人的学习成长历程来看 xff0c 从0到1确实很难 我个人在对这款毫米波雷达的学习的过程中也比较痛苦 xff0c 资料缺乏 xf
  • 2022年度GitHub最火的力扣算法刷题宝典,手把手教你如何刷力扣~

    前言 昨晚逛了逛GitHub xff0c 无意中看到一位P8大佬的算法刷题笔记 xff0c 感觉发现了宝藏 xff01 有些小伙伴可能已经发现了 xff0c 但咱这里还是忍不住安利一波 xff0c 怕有些小伙伴没有看到 关于算法刷题的困惑和
  • LIO-SAM学习与运行测试数据集

    文章目录 0 说明0 1 环境配置说明0 2 LIO SAM0 3 系统架构0 4 LIO SAM youtube视频演示 xff1a Rotation Dataset Walking Dataset Park Dataset Campus
  • 理解ROS:参数服务器和动态参数

    文章目录 1 程序中的getparam与param1 1 getparam xff08 无默认值 xff09 1 2 param xff08 有默认值 xff09 1 3 删除参数1 4 程序中设置参数1 5 检查参数1 6 搜索参数 2
  • ROS理解:ros中的坐标以及对tf2进行解读

    文章目录 1 ROS中的坐标2 tf到tf2的变化3 发布静态tf24 发布动态tf25 监听tf26 增加自己的frame 官网就是最好的教程 xff0c 如果阅读英文没什么压力 xff0c 强烈推荐以下链接进行全面了解 xff1a 官网
  • gtsam:从入门到使用

    文章目录 一 总览二 贝叶斯网络和因子图三 机器人运动建模3 1 使用因子图建模3 2 建立因子图3 3 因子图与变量3 4 GTSAM中的非线性优化3 5 全后验推论 四 机器人定位4 1 一元测量因子4 2 自定义因子4 3 使用自定义
  • 马尔可夫链、隐马尔科夫模型、贝叶斯网络、因子图

    文章目录 一 马尔可夫链以及隐马尔可夫模型1 1 概念1 2 举例说明隐马尔可夫模型 二 贝叶斯网络三 因子图 贝叶斯网络是很多概率模型的基础 xff0c 对于slam研究也是一项必须掌握的数学理论工具 一 马尔可夫链以及隐马尔可夫模型 1
  • 3D打印机DIY之一------Prusa i3的材料清单和总体结构组装

    自己使用铝件和亚克力板组装了一台Prusa i3 3D打印机 xff0c 现在把详细的过程记录下来 总体效果图 xff1a 一 材料清单 元件数量总价2020欧式铝方管 xff1a 4根400mm 3根340mm 1根150mm 1根130
  • 位置式PID与增量式PID的介绍和代码实现

    PID分为位置式PID与增量式PID 一 位置式PID 1 表达式为 xff1a 2 缺点 xff1a 1 xff09 由于全量输出 xff0c 所以每次输出均与过去状态有关 xff0c 计算时要对ek进行累加 xff0c 工作量大 xff
  • 常见蓝牙模块介绍和AT指令

    目录 一 HC 05主从一体蓝牙模块 二 HC 06从机蓝牙模块 三 低功耗BLE蓝牙4 0模块 cc2540或cc2541 四 JDY 10 蓝牙4 0 BLE模块 五 蓝牙模块LAYOUT注意事项 xff1a 常见的蓝牙模块为 xff1
  • PID参数调节总结

    原文链接 xff1a 点击打开链接 经验 xff1a 1 采样频率低 xff08 如500ms xff09 xff0c Kp一般是0 01级别 xff1b 采样频率高 xff08 如1ms xff09 xff0c Kp一般是1级别 2 先只
  • 为Keil添加注释的快捷键

    Keil刚装上是没有注释快捷键的 xff0c 可以自己添加 xff0c Edit Configuration xff0c 然后选择 Shortcut Keys 标签页 xff0c 下拉找到 Comment Selection xff0c 然
  • C语言__attribute__的使用

    一 介绍 GNU C 的一大特色就是 attribute 机制 attribute 可以设置函数属性 xff08 Function Attribute xff09 变量属性 xff08 Variable Attribute xff09 和类
  • ros(30):while(ros::ok()){}理解与使用示例

    while ros ok 理解 while ros ok 是ros的一种循环模式 xff0c 和ros Rate loop rate ros spinOnce 等结合可以控制程序的执行顺序 ros Rate loop rate 10 设置循
  • Jetson TX2更换软件源

    TX2的软件源为国外服务器 xff0c 网速会很慢 xff0c 需要换国内的ARM源 备份 etc lib路径下的source list文件 xff0c 然后在终端 xff08 按ctrl 43 alt 43 T打开 xff09 执行以下命
  • 使用Dockerfile创建镜像

    Dockerfile是一个文本格式的配置文件 xff0c 可以使用Dockerfile来快速创建自定义的镜像 一 基本结构 Dockerfile由一行行命令语句组成 xff0c 并且支持以 开头的注释行 一般而言 xff0c Dockerf