Docker 镜像制作(Dockerfile)

news2024/9/21 10:41:55

1 Dockerfile 概念

Dockerfile 是什么?
  镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,这个脚本就是 Dockerfile。
  Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction), 每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

为什么需要 Dockerfile?
可以按照需求自定义镜像
  和 docker commit 一样能够自定义镜像,官方的镜像可以说很少能直接满足
我们应用的,都需要我们自己打包自己的代码进去然后做成对应的应用镜像对外
使用。
很方便的自动化构建,重复执行
  通过 dockerfile 可以自动化的完成镜像构建,而不是像 docker commit 一样,
手动一个命令一个命令执行,而且可以重复执行, docker commit 的话很容易忘
记执行了哪个命令,哪个命令没有执行。
维护修改方便,不再是黑箱操作:
  使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也
被称为黑箱镜像,dockerfile 很容易二次开发。
更加标准化,体积可以做的更小:
  docker 容器启动后,系统运行会生成很多运行时的文件,如果使用 commit 会
导致这些文件也存储到镜像里面,而且 commit 的时候安装了很多的依赖文件,
没有有效的清理机制的话会导致镜像非常的臃肿。使用 Dockerfile 则会更加标准
化,而且提供多级构建,将编译和构建分开,不会有运行时的多余文件,更加的
标准化。

2 Dockerfile 指令

2.1 FROM

•功能:
○ FROM 指令用于为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像所提供的运行环境;
注意事项
○ FROM 指令必须是 Dockerfile 中非注释行或者 ARG 之后的第一个指令;
○ 实践中,基准镜像可以是任何可用镜像文件,默认情况下, docker build 会在docker 主机上查找指定的镜像文件,在其不存在时,则会自动从 Docker 的公共库 pull 镜像下来。如果找不到指定的镜像文件, docker build 会返回一个错误信息;
○ FROM 可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像,或将一个构建阶段作为另一个的依赖。
○ 如果 FROM 语句没有指定镜像标签,则默认使用 latest 标签。

FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]

• 参数
○ <platform>:构建的 cpu 架构,如 linux/amd64, linux/arm64,windows/amd64
○ <image>:指定作为 base image 的名称;
○ <tag>: base image 的标签,省略时默认 latest;
○ <digest>:是镜像的哈希码;
○ AS <name>: 指定构建步骤的名称,配合 COPY --from=<name>可以完成多级构建;

实操:

打开Dockerfile文件

vim Dockerfile

编辑一下代码

FROM ubuntu:22.04 as baseOs

执行命令

docker build -t testimage:v0.1 .

2.2 LABEL

• 功能
○ 为镜像添加元数据,元数据是 kv 对形式;

LABEL <key>=<value> <key>=<value> <key>=<value> ...

实操:

编辑Dockerfile

FROM ubuntu:22.04 as baseOs
LABEL whoami="a coder"

执行命令

docker build -t testimage:v0.2 .

docker inspect testimage:v0.2

获得如下字段 

2.3 COPY 

• 功能
○ 用于从 docker 主机复制新文件或者目录至创建的新镜像指定路径中 。

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

• 参数
○ <src>:要复制的源文件或目录, 支持使用通配符;
○ <dest>:目标路径,即正在创建的 image 的文件系统路径; 建议<dest>使用绝对路径,否则, COPY 指定以 WORKDIR 为当前路径在路径中有空白字符时,通常使用第 2 种格式;
○ --chown:修改用户和组
○ --from <name>可选项 :
▪ 可以从之前构建的步骤中拷贝内容,结合 FROM .. AS <name>往往用作多级构建
• 注意事项
○ <src>必须是 build 上下文中的路径, 不能是其父目录中的文件;
○ 如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制;
○ 如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以 / 结尾;
○ 如果<dest>事先不存在,它将会被自动创建,这包括父目录路径。 

实操:

随便创建一个文件

touch code.cc

编辑Dockerfile

FROM ubuntu:22.04 as baseOs
LABEL whoami="a coder"
COPY code.cc /data/code/

 执行命令

docker build -t testimage:v0.3 .

docker run -it --rm testimage:v0.3 ls /data/code

 发现该目录下果然拷贝有code.cc

2.4 ENV

• 功能
○ 用于为镜像定义所需的环境变量,并可被 Dockerfile 文件中位于其后的其它指令(如 ENV、 ADD、 COPY 等)所调用
○ 调用格式为$variable_name 或 ${variable_name}

ENV <key>=<value> ...

实操:

编辑Dockerfile

FROM ubuntu:22.04 as baseOs
LABEL whoami="a coder"
ENV DIR=/data/code/
COPY code.cc ${DIR}

 执行命令

docker build -t testimage:v0.4 .

 效果同2.3故省略后续操作

2.5 WORKDIR

• 功能
○ 为 Dockerfile 中所有的 RUN、 CMD、 ENTRYPOINT、 COPY 和 ADD 指定设定工作目录

WORKDIR /path/to/workdir

• 注意事项
○ 默认的工作目录是/
○ 如果提供了相对路径,它将相对于前一条 WORKDIR 指令的路径。
○ WORKDIR 指令可以解析先前使用设置的环境变量 ENV。

实操:

编辑Dockerfile

FROM ubuntu:22.04 as baseOs
LABEL whoami="a coder"
ENV DIR=/data/code/
COPY code.cc ${DIR}
WORKDIR /usr/local

 执行命令

docker build -t testimage:v0.5 .

pwd查看虚拟机工作目录

2.6 ADD

功能
○ ADD 指令类似于 COPY 指令, ADD 支持使用 TAR 文件和 URL 路径,会自动完成解压和下载;

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

• 参数
○ <src>:要复制的源文件或目录, 支持使用通配符;
○ <dest>:目标路径,即正在创建的 image 的文件系统路径; 建议<dest>使用绝对路径,否则, ADD 指定以 WORKDIR 为其实路径;在路径中有空白字符时,通常使用第 2 种格式;
○ --chown:修改用户和组

实操:

编辑Dockerfile

FROM ubuntu:22.04 as baseOs
LABEL whoami="a coder"
ENV DIR=/data/code/
ENV NGINX_VERSION="nginx-1.22.1"
COPY code.cc ${DIR}
WORKDIR /usr/local
ADD https://nginx.org/download/${NGINX_VERSION}.tar.gz ./src

执行命令

docker build -t dockerimage:v0.6 .

 最后效果

如果指定的是URL它的压缩包没有被解压,但是如果是宿主机上的压缩包就会被解压 ;

2.7 RUN

• 功能
○ 用于指定 docker build 过程中运行的程序,其可以是任何命令;

#shell form
RUN <command>
#exec form 推荐这种
RUN ["executable", "param1", "param2"]

• 参数
○ 第一种格式中, <command>通常是一个 shell 命令, 且以“/bin/sh -c”来运行它,Windows 默认为 cmd /S /C。如果一个脚本 test.sh 不能自己执行,必须要/bin/sh -c test.sh 的方式来执行,那么,如果使用 RUN 的 shell 形式,最后得到的命令相当于:
 

/bin/sh -c "/bin/sh -c 'test.sh'"

○ 第二种语法格式中的参数是一个 JSON 格式的数组,其中<executable>为要运行的命令,后面的 <paramN>为传递给命令的选项或参数;然而,此种格式指定的命令不会以“/bin/sh -c”来发起,因此常见的 shell 操作如变量替换以及通配符(?,*等)替换将不会进行;不过,如果要运行的命令依赖于此 shell 特性的话,可以将其替换为类似下面的格式。

RUN ["/bin/bash", "-c", "<executable>","<param1>"]

实操

编辑Dockerfile

 

FROM ubuntu:22.04 as baseOs
LABEL whoami="a coder"
ENV DIR=/data/code/
ENV NGINX_VERSION="nginx-1.22.1"
COPY code.cc ${DIR}
WORKDIR /usr/local
ADD https://nginx.org/download/${NGINX_VERSION}.tar.gz ./src
RUN cd ./src && tar zxvf ${NGINX_VERSION}.tar.gz

执行命令

docker build -t testimage:v0.7 .

 查看效果

2.8 CMD

• 功能
○ 类似于 RUN 指令, CMD 指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同
○ RUN 指令运行于映像文件构建过程中,而 CMD 指令运行于基于 Dockerfile构建出的新映像文件启动一个容器时
○ CMD 指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过, CMD 指定的命令其可以被 docker run 的命令行选项所覆盖
○ 在 Dockerfile 中可以存在多个 CMD 指令,但仅最后一个会生效

CMD ["executable","param1","param2"] (exec form, this is the
preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

2.9 EXPOSE

• 功能
○ 用于为容器声明打开指定要监听的端口以实现与外部通信
○ 该 EXPOSE 指令实际上并不发布端口。它充当构建图像的人和运行容器的人之间的一种文档,关于要发布哪些端口。要在运行容器时实际发布端口,使用-p 参数发布和映射一个或多个端口,或者使用-Pflag 发布所有暴露的端口并将它们映射宿主机端口;

EXPOSE <port> [<port>/<protocol>...]

• 参数
○ <protocol>: tcp/udp 协议
○ <port>:端口

2.10 ENTRYPOINT

• 功能
○ 用于指定容器的启动入口

#exec from
ENTRYPOINT ["executable", "param1", "param2"]
# shell form
ENTRYPOINT command param1 param2

实操:

编辑Dockerfile

FROM ubuntu:22.04 as baseOs
LABEL whoami="a coder"
ENV DIR=/data/code/
ENV NGINX_VERSION="nginx-1.22.1"
COPY code.cc ${DIR}
WORKDIR /usr/local
ADD https://nginx.org/download/${NGINX_VERSION}.tar.gz ./src
RUN cd ./src && tar zxvf ${NGINX_VERSION}.tar.gz
#1.安装 build-essential 构建工具
#2.安装依赖包 libpcre3 libpcre3-dev zlib1g-dev 依赖库
RUN apt-get update -y && apt install -y build-essential libpcre3 libpcre3-dev zlib1g-dev
#3.进入 nginx 目录
#4.执行编译和构建
RUN cd ./src/${NGINX_VERSION} \
&& ./configure --prefix=/usr/local/nginx \
&& make && make install
ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-g daemon off;"]

 2.11 ARG

• 功能
○ ARG 指令类似 ENV,定义了一个变量;区别于 ENV:用户可以在构建时
docker build --build-arg <varname> = <value> 进行对变量的修改; ENV 不可以;
○ 如果用户指定了未在 Dockerfile 中定义的构建参数,那么构建输出警告。

ARG <name>[=<default value>]

• 注意事项
○ Dockerfile 可以包含一个或多个 ARG 指令
○ ARG 支持指定默认值
○ 使用范围:定义之后才能使用,定义之前为空

○ ENV 和 ARG 同时存在, ENV 会覆盖 ARG

实操:
编辑Dockerfile

ARG UBUNTU_VERSION=22.04
FROM ubuntu:${UBUNTU_VERSION} as baseOs
LABEL whoami="a coder"
ENV DIR=/data/code/
ENV NGINX_VERSION="nginx-1.22.1"
COPY code.cc ${DIR}
WORKDIR /usr/local
ADD https://nginx.org/download/${NGINX_VERSION}.tar.gz ./src
RUN cd ./src && tar zxvf ${NGINX_VERSION}.tar.gz
#1.安装 build-essential 构建工具
#2.安装依赖包 libpcre3 libpcre3-dev zlib1g-dev 依赖库
RUN apt-get update -y && apt install -y build-essential libpcre3 libpcre3-dev zlib1g-dev
#3.进入 nginx 目录
#4.执行编译和构建
RUN cd ./src/${NGINX_VERSION} \
&& ./configure --prefix=/usr/local/nginx \
&& make && make install
ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-g daemon off;"]

执行命令

docker build --build-arg UBUNTU_VERSION=22.10 -t testimage:v0.9 .

 如果拉取镜像较慢可以先docker pull将ubuntu22.10拉取到本地

2.12 VOLUME(了解)

• 功能
○ 用于在 image 中创建一个挂载点目录
○ 通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

VOLUME <mountpoint>
VOLUME ["<mountpoint>"]

• 参数
○ mountpoint:挂载点目录
○ 注意事项
如果挂载点目录路径下此前有文件存在, docker run 命令会在卷挂载完
成后将此前的所有文件复制到新挂载的卷中

▪ 其实 VOLUME 指令只是起到了声明了容器中的目录作为匿名卷,但是并
没有将匿名卷绑定到宿主机指定目录的功能。
▪ volume 只是指定了一个目录,用以在用户忘记启动时指定-v 参数也可以
保证容器的正常运行。比如 mysql,你不能说用户启动时没有指定-v,然后
删了容器,就把 mysql 的数据文件都删了,那样生产上是会出大事故的,所
以 mysql 的 dockerfile 里面就需要配置 volume,这样即使用户没有指定-v,
容器被删后也不会导致数据文件都不在了。还是可以恢复的。
volume 与-v 指令一样,容器被删除以后映射在主机上的文件不会被删除。
▪ 如果-v 和 volume 指定了同一个位置,会以-v 设定的目录为准,其实
volume 指令的设定的目的就是为了避免用户忘记指定-v 的时候导致的数据丢
,那么如果用户指定了-v,自然而然就不需要 volume 指定的位置了。

2.13 SHELL(了解)

• 功能
○ SHELL 指令允许覆盖用于 shell 命令形式的默认 shell。

#Linux 上的默认 shell 是["/bin/sh", "-c"]
#在 Windows 上是["cmd", "/S","/C"]

○ SHELL 指令必须以 JSON 格式写入 Dockerfile。

SHELL ["executable", "parameters"]

• 参数
○ executable: shell 可执行文件的位置
○ parameters: shell 执行的参数
○ 注意事项
▪ SHELL 指令可以多次出现。
▪ 每个 SHELL 指令都会覆盖所有先前的 SHELL 指令,并影响所有后续指令。
▪ 该 SHELL 指令在 Windows 上特别有用,因为 windows 行有两种不同的
shell: cmd 和 powershell

2.14 USER (了解)

• 功能
○ 用于指定运行 image 时的或运行 Dockerfile 中任何 RUN、 CMD 或
ENTRYPOINT 指令定的程序时的用户名或 UID
○ 默认情况下, container 的运行身份为 root 用户

USER <user>[:<group>]
USER <UID>[:<GID>]

• 参数
○ user:用户
○ group:用户组
○ uid:用户 id
○ gid:组 id
○ 注意事项
▪ <UID>可以为任意数字,但实践中其必须为/etc/passwd 中某用户的有效
UID,否则将运行失败

2.15 HEALTHCHECK(了解)

• 功能
○ HEALTHCHECK 指令告诉 Docker 如何测试容器以检查它是否仍在工作。
○ 即使服务器进程仍在运行,这也可以检测出陷入无限循环且无法处理新连接
的 Web 服务器等情况

HEALTHCHECK [OPTIONS] CMD command (check container health by
running a command inside the container)
HEALTHCHECK NONE (disable any healthcheck inherited from the base
image)

• 参数
○ OPTIONS 选项有:
▪ --interval=DURATION (default: 30s):每隔多长时间探测一次,默认 30
秒 ▪
-- timeout= DURATION (default: 30s):服务响应超时时长,默认 30 秒
▪ --start-period= DURATION (default: 0s):服务启动多久后开始探测,默
认 0 秒
▪ --retries=N (default: 3):认为检测失败几次为宕机,默认 3 次
○ 返回值
▪ 0:容器成功是健康的,随时可以使用
▪ 1:不健康的容器无法正常工作
▪ 2:保留不使用此退出代码

#样例
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1

2.16 ONBUILD

• 功能
○ 用于在 Dockerfile 中定义一个触发器
○ 以该 Dockerfile 中的作为基础镜像由 FROM 指令在 build 过程中被执行时,
将会“触发”创建其 base image 的 Dockerfile 文件中的 ONBUILD 指令定义的触
发器

#样例
ONBUILD ADD . /app/src

3 docker build

• 功能

docker build 命令用于使用 Dockerfile 创建镜像。

docker build [OPTIONS] PATH | URL | -

• 关键参数
○ --build-arg=[] :设置镜像创建时的变量;
○ -f :指定要使用的 Dockerfile 路径;
○ --label=[] :设置镜像使用的元数据;
○ --no-cache :创建镜像的过程不使用缓存;
○ --pull :尝试去更新镜像的新版本;
○ --quiet, -q :安静模式,成功后只输出镜像 ID;
○ --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构
建中为一个镜像设置多个标签。
○ --network: 默认 default。在构建期间设置 RUN 指令的网络模式

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

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

相关文章

CVE-2024-2389 未经身份验证的命令注入

什么是 Progress Flowmon? Progress Flowmon 是一种网络监控和分析工具,可提供对网络流量、性能和安全性的全面洞察。Flowmon 将 Nette PHP 框架用于其 Web 应用程序。 未经身份验证的路由 我们开始在“AllowedModulesDecider.php”文件中枚举未经身份验证的端点,这是一个描…

superset 解决在 mac 电脑上发送 slack 通知的问题

参考文档: https://superset.apache.org/docs/configuration/alerts-reports/ 核心配置: FROM apache/superset:3.1.0USER rootRUN apt-get update && \apt-get install --no-install-recommends -y firefox-esrENV GECKODRIVER_VERSION0.29.0 RUN wget -q https://g…

边缘智能-大模型架构初探

R2Cloud接口 机器人注册 请求和应答 注册是一个简单的 HTTP 接口&#xff0c;根据机器人/用户信息注册&#xff0c;创建一个新机器人。 请求 URL URLhttp://ip/robot/regTypePOSTHTTP Version1.1Content-Typeapplication/json 请求参数 Param含义Rule是否必须缺省roboti…

活动系统开发之采用设计模式与非设计模式的区别-后台功能总结

1、数据库ER图 2、后台功能字段 题目功能字段 数据列表 编号题目名称选项数量状态 1启用0禁用创建时间修改时间保存 题目名称选项集 选项内容是否正确答案 1正确0错误启禁用删除素材图库功能字段 数据列表 编号原文件名称文件类型文件大小加密后文件名文件具体路径上传类型状态…

为您的任意模型赋能——RAG

随着大语言模型的参数规模越来越大&#xff0c;微调模型的代价越来越大&#xff0c;于是知识检索增强的方式成为越来越主流的选择。通过提前准备好的知识库&#xff0c;在模型进行推理之前进行知识检索作为上下文一同交给大模型进行推理&#xff0c;从而提升大模型对领域知识的…

kafka 一步步探究消费者组与分区分配策略

本期主要聊聊kafka消费者组与分区 消费者组 & 消费者 每个消费者都需要归属每个消费者组&#xff0c;每个分区只能被消费者组中一个消费者消费 上面这段话还不够直观&#xff0c;我们举个例子来说明。 订单系统 订单消息通过 order_topic 发送,该topic 有 5个分区 结算系…

Cursor免费 GPT-4 IDE 工具的保姆级使用教程

Cursor免费 GPT-4 IDE 工具的保姆级使用教程 简介 Cursor 是一款基于人工智能技术的代码生成工具。 它利用先进的自然语言处理和深度学习算法&#xff0c;可根据用户的输入或需求&#xff0c;自动生成高质量代码。 不管是初学者&#xff0c;还是资深开发者&#xff0c;Curs…

网络爬虫到底难在哪里?

如果你是自己做爬虫脚本开发&#xff0c;那确实难&#xff0c;因为你需要掌握Python、HTML、JS、xpath、database等技术&#xff0c;而且还要处理反爬、动态网页、逆向等情况&#xff0c;不然压根不知道怎么去写代码&#xff0c;这些技术和经验储备起码得要个三五年。 比如这几…

Qt5详细安装教程(包含导入pycharm)

1.自行下载Qt 2.双击进行安装 3.设置完成后勾选接受&#xff0c;跳转下一步 4.可选择安装位置&#xff0c;比较习惯安装在D盘 5.根据需求勾选对应组件安装 6.安装完成后&#xff0c;打开pycharm&#xff0c;进入settings—>选择ExternalTools&#xff0c;根据以下步骤进行配…

python怎么读json文件

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式&#xff0c;但是也使用了类似于C语言家族的习惯(包括C、C、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人…

LeetCode004-两个有序数组的中位数-最优算法代码讲解

最有帮助的视频讲解 【LeetCode004-两个有序数组的中位数-最优算法代码讲解】 https://www.bilibili.com/video/BV1H5411c7oC/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a 时间复杂度 O ( l o g ( m i n ( m , n ) ) ) O(log(min(m,n))) O(log(min(…

将flux1画图API封装为Dify工作流

本文主要介绍将公开的 flux1 画图 API&#xff08;https://api-flux1.api4gpt.com/&#xff09;封装为 Dify 工作流。 1.构建工作流 新建一个"聊天助手-> 工作流编排"的"flux1 工作流"&#xff1a; 总共使用了开始、HTTP 请求和直接回复 3 个节点。如…

【2025】基于微信小程序的网上点餐系统设计与实现、基于微信小程序的智能网上点餐系统、微信小程序点餐系统设计、智能点餐系统开发、微信小程序网上点餐平台设计

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

根据 IP 地址进行 VPN 分流(详细,亲测,通用)

根据 IP 地址进行 VPN 分流&#xff08;详细&#xff0c;亲测&#xff0c;通用&#xff09; 背景 不在学校的时候需要使用实验室的服务器&#xff0c;但是实验室的服务器只能在校园网内访问&#xff0c;因此在校外就需要使用学校的 VPN&#xff0c;但是打开 VPN 以后会默认将…

除了 SEO 之外,HTML 语义化还有什么用?

每次碰到 HTML 语义化的话题&#xff0c;几乎 99% 的前端都会想到 SEO。那除了 SEO&#xff0c;你还会想到什么呢&#xff1f;好像没有了。。。 确实&#xff0c;当我们要做 SEO 的时候&#xff0c;往往第一时间都会想到优化 HTML 语义化&#xff0c;久而久之&#xff0c;大家…

Linux下rpm方式部署mysql(国产化生产环境无联网服务器部署实操)

请放心观看&#xff0c;已在正式环境部署验证&#xff0c;流程无问题&#xff01; 所用系统为国产化麒麟银河 aarch64系统&#xff0c;部署时间2024年9月份&#xff01; #查看服务器信息 #涉及生产服务器&#xff0c;所以输出信息隐藏了一部分[rootecs-xxxxx hdata]# uname -…

五、CAN总线

目录 一、基础知识 1、can介绍 2、CAN硬件电路 3、CAN电平标准 4、CAN收发器芯片介绍 5、CAN帧格式 ① CAN帧种类 ② CAN数据帧 ③ CAN遥控帧​编辑 ④ 位填充 ⑤ 波形实例 6、接收方数据采样 ① 接收方数据采样遇到的问题 ② 位时序 ③ 硬同步 ④ 再同步 ⑤ 波…

【Delphi】实现接收系统拖动文件

在 Delphi 中&#xff0c;可以通过以下步骤来实现将文件夹中的文件拖动到 Form 上&#xff0c;并在拖动时显示文件类型的光标。我们可以利用 VCL 中的 Drag and Drop 机制来处理拖动操作&#xff0c;以及自定义光标显示。 以下是详细的步骤和代码示例&#xff1a; 实现步骤&a…

MATLAB系列05:自定义函数

MATLAB系列05&#xff1a;自定义函数 5. 自定义函数5.1 MATLAB函数简介5.2 在MATLAB中传递变量&#xff1a;按值传递机制5.3 选择性参数5.4 用全局内存分享数据5.5 在函数两次调用之间本地数据的存储5.6 函数的函数(function functions)5.7 子函数和私有函数5.8 总结 5. 自定义…

问题:WINCC 7.5 结构变量只能是内部变量吗?

问题&#xff1a;WINCC 7.5 结构变量只能是内部变量吗&#xff1f; 答案&#xff1a;不是的呢&#xff0c;你创建结构的时候可以选择外部变量的 如图&#xff1a;工控人加入PLC工业自动化精英社群 #WINCC 7.5##变量##结构##西门子工业支持中心#