【Docker】镜像制作
个人主页秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 系列专栏Docker_秦jh_的博客-CSDN博客​​​​​目录Docker 镜像制作镜像制作及原因Docker 镜像制作方式快照方式制作镜像制作命令docker commitDockerfile 制作镜像Dockerfile 是什么Dockerfile 格式生活案例为什么需要 DockerfileDockerfile 指令指令清单FROMMAINTAINERLABELCOPYENVWORKDIRADDRUNCMDEXPOSEENTRYPOINTARGVOLUMESHELLUSERHEALTHCHECKONBUILDSTOPSIGNAL制作命令docker buildDockerfile 编写优秀实践操作实战CMD 与 EntryPoint 实战基础知识覆盖Shell 和 Exec 模式组合模式实战覆盖Shell VS Exec组合镜像制作常见问题前言 hello! 各位铁子们大家好哇。今日更新了Docker相关内容 欢迎大家关注点赞收藏⭐️留言Docker 镜像制作镜像制作及原因镜像制作是因为某种需求官方的镜像无法满足需求需要我们通过一定手段来自定 义镜像来满足要求。制作镜像往往因为以下原因1. 编写的代码如何打包到镜像中直接跟随镜像发布2. 第三方制作的内容安全性未知如含有安全漏洞3. 特定的需求或者功能无法满足如需要给数据库添加审计功能4. 公司内部要求基于公司内部的系统制作镜像如公司内部要求使用自己的操作系 统作为基础镜像Docker 镜像制作方式制作容器镜像主要有两种方法• 制作快照方式获得镜像偶尔制作的镜像在基础镜像上比如 Ubuntu先登 录容器中然后安装镜像需要的所有软件最后整体制作快照。• Dockerfile 方式构建镜像经常更新的镜像将软件安装的流程写成 Dockerfile 使用 docker build 构建成容器镜像。快照方式制作镜像制作命令docker commit• 功能 从容器创建一个新的镜像。语法docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]参数 -a :提交的镜像作者 -c :使用 Dockerfile 指令来创建镜像可以修改启动指令 -m :提交时的说明文字 -p :在 commit 时将容器暂停。样例docker commit c3f279d17e0a maxhou/mynginx:v01Dockerfile 制作镜像Dockerfile 是什么镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层 修改、安装、构建、操作的命令都写入一个脚本用这个脚本来构建、定制镜像,这个 脚本就是 DockerfileDockerfile 是一个文本文件其内包含了一条条的指令(Instruction)每一条指令 构建一层因此每一条指令的内容就是描述该层应当如何构建。Dockerfile 格式# CommentINSTRUCTION arguments该指令不区分大小写。然而约定是它们是大写的以便更容易地将它们与参数区分 开来。Docker 按顺序运行指令 DockerfileDocker 将以开头的行视为#注释行中其他任何地方的标记#都被视为参数。生活案例为什么需要 Dockerfile• 可以按照需求自定义镜像 和 docker commit 一样能够自定义镜像官方的镜像可以说很少能直接满足 我们应用的都需要我们自己打包自己的代码进去然后做成对应的应用镜像对外 使用。• 很方便的自动化构建重复执行 通过 dockerfile 可以自动化的完成镜像构建而不是像 docker commit 一样 手动一个命令一个命令执行而且可以重复执行docker commit 的话很容易忘 记执行了哪个命令哪个命令没有执行。• 维护修改方便不再是黑箱操作 使用 docker commit 意味着所有对镜像的操作都是黑箱操作生成的镜像也 被称为黑箱镜像,dockerfile 很容易二次开发。• 更加标准化体积可以做的更小 docker 容器启动后系统运行会生成很多运行时的文件如果使用 commit 会 导致这些文件也存储到镜像里面而且 commit 的时候安装了很多的依赖文件 没有有效的清理机制的话会导致镜像非常的臃肿。使用 Dockerfile 则会更加标准 化而且提供多级构建将编译和构建分开不会有运行时的多余文件更加的 标准化。Dockerfile 指令指令清单FROM功能 FROM 指令用于为镜像文件构建过程指定基础镜像后续的指令运行于此基 础镜像所提供的运行环境注意事项 FROM 指令必须是 Dockerfile 中非注释行或者 ARG 之后的第一个指令 实践中基准镜像可以是任何可用镜像文件默认情况下docker build 会在 docker 主机上查找指定的镜像文件在其不存在时则会自动从 Docker 的公共 库 pull 镜像下来。如果找不到指定的镜像文件docker build 会返回一个错误信 息 FROM 可以在一个 Dockerfile 中出现多次如果有需求在一个 Dockerfile 中 创建多个镜像,或将一个构建阶段作为另一个的依赖。 如果 FROM 语句没有指定镜像标签则默认使用 latest 标签。语法FROM [--platform] [AS ]FROM [--platform] [:] [AS ]FROM [--platform] [] [AS ]参数 platform:构建的 cpu 架构如 linux/amd64, linux/arm64, windows/amd64 image指定作为 base image 的名称 tagbase image 的标签省略时默认 latest digest是镜像的哈希码 AS name : 指定构建步骤的名称配合 COPY --fromname可以完成多 级构建样例FROM busybox:latestMAINTAINER功能 用于让 dockerfile 制作者提供本人的详细信息 该功能已经废弃由 label 替代语法MAINTAINER authtors detail参数authtors detail作者信息样例MAINTAINER XXX XXXXXLABEL功能 为镜像添加元数据元数据是 kv 对形式语法LABEL keyvalue keyvalue keyvalue ...样例LABEL com.example.label-with-valuefooLABEL multi.label1value1 multi.label2value2 othervalue3COPY功能 用于从 docker 主机复制新文件或者目录至创建的新镜像指定路径中 。语法COPY [--chownuser:group] src...destCOPY [--chownuser:group] [src,... dest]参数 src要复制的源文件或目录支持使用通配符 dest目标路径即正在创建的 image 的文件系统路径建议使用 dest绝对路径否则COPY 指定以 WORKDIR 为当前路径在路径中有空白字符时通常使用第 2 种格式 --chown修改用户和组 --from 可选项 :▪ 可以从之前构建的步骤中拷贝内容结合 FROM .. AS 往往用作 多级构建后续我们有实战课专门完成多级构建注意事项 src必须是 build 上下文中的路径不能是其父目录中的文件 如果src是目录则其内部文件或子目录会被递归复制但src目录自身 不会被复制 如果指定了多个src或在src中使用了通配符则dest必须是一个目 录且必须以 / 结尾 如果dest事先不存在它将会被自动创建这包括父目录路径。样例COPY index.html /data/web/html/ #要确保 dockerfile 同级路径下有 index.html 文件ENV功能 用于为镜像定义所需的环境变量并可被 Dockerfile 文件中位于其后的其它指 令(如 ENV、ADD、COPY 等)所调用 调用格式为$variable_name 或 ${variable_name}语法ENV keyvalue ...样例ENV MY_NAMEJohn DoeWORKDIR功能 为 Dockerfile 中所有的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指定设 定工作目录语法WORKDIR /path/to/workdir注意事项 默认的工作目录是/ 如果提供了相对路径它将相对于前一条 WORKDIR 指令的路径。 WORKDIR 指令可以解析先前使用设置的环境变量 ENV样例WORKDIR /aWORKDIR bWORKDIR cRUN pwd#此处最终命令的输出 Dockerfile 为/a/b/c.ADD功能 ADD 指令类似于 COPY 指令ADD 支持使用 TAR 文件和 URL 路径,会自动 完成解压和下载语法ADD [--chownuser:group] src...destADD [--chownuser:group] [src,... dest]参数 src要复制的源文件或目录支持使用通配符 dest目标路径即正在创建的 image 的文件系统路径建议使用dest 绝对路径否则ADD 指定以 WORKDIR 为其实路径在路径中有空白字符时 通常使用第 2 种格式 --chown修改用户和组RUN功能 用于指定 docker build 过程中运行的程序其可以是任何命令语法#shell formRUN command#exec formRUN [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]样例ENV WEB_SERVER_PACKAGE nginx-1.21.1.tar.gzRUN cd ./src tar -xf ${WEB_SERVER_PACKAGE}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)注意事项 第二种则用于为 ENTRYPOINT 指令提供默认参数 json 数组中要使用双引号单引号会出错样例CMD [/usr/bin/wc,--help]EXPOSE功能 用于为容器声明打开指定要监听的端口以实现与外部通信 该 EXPOSE 指令实际上并不发布端口。它充当构建图像的人和运行容器的人之 间的一种文档关于要发布哪些端口。要在运行容器时实际发布端口使用-p 参 数发布和映射一个或多个端口或者使用-Pflag 发布所有暴露的端口并将它们映 射宿主机端口。语法EXPOSE port[port/protocol...]参数 protocoltcp/udp 协议 port端口样例EXPOSE 80/tcpENTRYPOINT功能 用于指定容器的启动入口语法#exec fromENTRYPOINT [executable, param1, param2]# shell formENTRYPOINT command param1 param2参数 json 数组中要使用双引号单引号会出错样例ENTRYPOINT [nginx,-g,daemon off;]ARG功能 ARG 指令类似 ENV定义了一个变量区别于 ENV用户可以在构建时 docker build --build-arg varnamevalue 进行对变量的修改ENV 不可以 如果用户指定了未在 Dockerfile 中定义的构建参数那么构建输出警告。语法ARG name[default value]注意事项 Dockerfile 可以包含一个或多个 ARG 指令 ARG 支持指定默认值 使用范围定义之后才能使用定义之前为空如下面的案例执行命令 docker build --build-arg usernamewhat_user .第二行计算结果为 some_user 不是我们指定的 build-arg 中的参数值 what_userFROM busyboxUSER ${username:-some_user}ARG usernameUSER $username# ... ENV 和 ARG 同时存在ENV 会覆盖 ARGFROM ubuntuARG CONT_IMG_VERENV CONT_IMG_VERv1.0.0RUN echo $CONT_IMG_VER执行下面指令输出 v1.0.0docker build --build-arg CONT_IMG_VERv2.0.1 .我们可以优化写法为FROM ubuntuARG CONT_IMG_VERENV CONT_IMG_VER${CONT_IMG_VER:-v1.0.0}RUN echo $CONT_IMG_VER 系统内置了一些 ARG 变量▪ HTTP_PROXY▪ http_proxy▪ HTTPS_PROXY▪ https_proxy▪ FTP_PROXY▪ ftp_proxy▪ NO_PROXY▪ no_proxy▪ ALL_PROXY▪ all_proxy样例FROM busyboxARG user1someuserARG buildno1VOLUME功能 用于在 image 中创建一个挂载点目录 通过 VOLUME 指令创建的挂载点无法指定主机上对应的目录是自动生成 的。语法VOLUME mountpointVOLUME [mountpoint]参数 mountpoint:挂载点目录注意事项▪ 如果挂载点目录路径下此前有文件存在docker run 命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中▪ 其实 VOLUME 指令只是起到了声明了容器中的目录作为匿名卷但是并 没有将匿名卷绑定到宿主机指定目录的功能。▪ volume 只是指定了一个目录用以在用户忘记启动时指定-v 参数也可以 保证容器的正常运行。比如 mysql你不能说用户启动时没有指定-v然后 删了容器就把 mysql 的数据文件都删了那样生产上是会出大事故的所 以 mysql 的 dockerfile 里面就需要配置 volume这样即使用户没有指定-v 容器被删后也不会导致数据文件都不在了。还是可以恢复的。▪ volume 与-v 指令一样容器被删除以后映射在主机上的文件不会被删除。▪ 如果-v 和 volume 指定了同一个位置会以-v 设定的目录为准其实 volume 指令的设定的目的就是为了避免用户忘记指定-v 的时候导致的数据丢 失那么如果用户指定了-v自然而然就不需要 volume 指定的位置了。样例VOLUME [/data1,/data2]SHELL功能 SHELL 指令允许覆盖用于 shell 命令形式的默认 shell。 Linux 上的默认 shell 是[/bin/sh-c]在 Windows 上是[cmd/S /C] SHELL 指令必须以 JSON 格式写入 Dockerfile。语法SHELL [executable, parameters]参数 executableshell 可执行文件的位置 parametersshell 执行的参数注意事项▪ SHELL 指令可以多次出现。▪ 每个 SHELL 指令都会覆盖所有先前的 SHELL 指令并影响所有后续指 令。▪ 该 SHELL 指令在 Windows 上特别有用因为 windows 行有两种不同的 shellcmd 和 powershell样例FROM microsoft/windowsservercore # Executed as cmd /S /C echo default RUN echo default # Executed as cmd /S /C powershell -command Write-Host default RUN powershell -command Write-Host default # Executed as powershell -command Write-Host hello SHELL [powershell, -command] RUN Write-Host hello # Executed as cmd /S /C echo hello SHELL [cmd, /S, /C] RUN echo helloUSER功能 用于指定运行 image 时的或运行 Dockerfile 中任何 RUN、CMD 或 ENTRYPOINT 指令定的程序时的用户名或 UID 默认情况下container 的运行身份为 root 用户语法USER user[:group]USER UID[:GID]参数 user:用户 group用户组 uid:用户 id gid:组 id注意事项▪ 可以为任意数字但实践中其必须为/etc/passwd 中某用户的有效 UID,否则将运行失败样例USER docker:dockerHEALTHCHECK功能 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 选项有▪ --intervalDURATION (default: 30s)每隔多长时间探测一次默认 30 秒▪ -- timeout DURATION (default: 30s)服务响应超时时长默认 30 秒▪ --start-period DURATION (default: 0s)服务启动多久后开始探测默 认 0 秒▪ --retriesN (default: 3)认为检测失败几次为宕机默认 3 次返回值▪ 0容器成功是健康的随时可以使用▪ 1不健康的容器无法正常工作▪ 2保留不使用此退出代码样例HEALTHCHECK --interval5m --timeout3s \ CMD curl -f http://localhost/ || exit 1ONBUILD功能 用于在 Dockerfile 中定义一个触发器 以该 Dockerfile 中的作为基础镜像由 FROM 指令在 build 过程中被执行时 将会“触发”创建其 base image 的 Dockerfile 文件中的 ONBUILD 指令定义的触 发器语法ONBUILD INSTRUCTION参数INSTRUCTIONdockerfile 的一条指令样例ONBUILD ADD . /app/srcSTOPSIGNAL功能 STOPSIGNAL 指令设置将发送到容器的系统调用信号。 此信号可以是与内核的系统调用表中的位置匹配的有效无符号数例如 9 或者 SIGNAME 格式的信号名例如 SIGKILL。语法STOPSIGNAL signal参数 STOPSIGNAL 指令设置将发送到容器出口的系统调用信号。 此信号可以是与 内核的系统调用表中的位置匹配的有效无符号数例如 9或者 SIGNAME 格式 的信号名例如 SIGKILL。常见的信号如下样例STOPSIGNAL 9制作命令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 指令的网络模式样例docker build -t mynginx:v1 .Dockerfile 编写优秀实践1. 善用.dockerignore 文件使用它可以标记在执行 docker build 时忽略的路径和文件避免发送不必要的数据内 容从而加快整个镜像创建过程。2. 镜像的多阶段构建通过多步骤创建可以将编译和运行等过程分开保证最终生成的镜像只包括运行应 用所需要的最小化环境。当然用户也可以通过分别构造编译镜像和运行镜像来达到 类似的结果但这种方式需要维护多个 Dockerfile。3. 合理使用缓存如合理使用 cache减少内容目录下的文件内容不变的指令尽量放在前面这样可 以尽量复用4. 基础镜像尽量使用官方镜像并选择体积较小镜像容器的核心是应用大的平台微服务可能几十上百个。选择过大的父镜像如 Ubuntu 系统镜像会造成最终生成应用镜像的臃肿推荐选用瘦身过的应用镜像如 node:slim或者较为小巧的系统镜像如 alpine、busybox 或 debian5. 减少镜像层数如果希望所生成镜像的层数尽量少则要尽量合并 RUN、ADD 和 COPY 指令。通常 情况下多个 RUN 指令可以合并为一条 RUN 指令如 apt get updateapt install 尽 量写到一行6. 精简镜像用途尽量让每个镜像的用途都比较集中单一避免构造大而复杂、多功能的镜像7. 减少外部源的干扰如果确实要从外部引入数据需要指定持久的地址并带版本信息等让他人可以复 用而不出错。8. 减少不必要的包安装只安装需要的包不要安装无用的包减少镜像体积。操作实战CMD 与 EntryPoint 实战基础知识ENTRYPOINT 和 CMD 都是在 docker image 里执行一条命令, 但是他们有一些微妙的 区别.一般来说两个大部分功能是相似的都能满足。比如执行运行一个没有调用 ENTRYPOINT 或者 CMD 的 docker 镜像, 返回错误一般 的镜像最后都提供了 CMD 或者 EntryPoint 作为入口。覆盖在写 Dockerfile 时, ENTRYPOINT 或者 CMD 命令会自动覆盖之前的 ENTRYPOINT 或者 CMD 命令.在 docker 镜像运行时, 用户也可以在命令指定具体命令, 覆盖在 Dockerfile 里的命令.如果你希望你的 docker 镜像只执行一个具体程序, 不希望用户在执行 docker run 的时 候随意覆盖默认程序. 建议用 ENTRYPOINT.Shell 和 Exec 模式ENTRYPOINT 和 CMD 指令支持 2 种不同的写法: shell 表示法和 exec 表示法.CMD 命令语法ENTRYPOINT 语法当使用 shell 表示法时, 命令行程序作为 sh 程序的子程序运行, docker 用/bin/sh -c 的语 法调用. 如果我们用 docker ps 命令查看运行的 docker, 就可以看出实际运行的是 /bin/sh -c 命令。这样运行的结果就是我们启动的程序的 PID 不是 1如果从外部发送 任何 POSIX 信号到 docker 容器, 由于/bin/sh 命令不会转发消息给实际运行的命令, 则不能安全得关闭 docker 容器。EXEC 语法没有启动/bin/sh 命令, 而是直接运行提供的命令, 命令的 PID 是 1. 无论你用 的是 ENTRYPOINT 还是 CMD 命令, 都强烈建议采用 exec 表示法。组合模式组合使用 ENTRYPOINT 和 CMD, ENTRYPOINT 指定默认的运行命令, CMD 指定默认 的运行参数.ENTRYPOINT 和 CMD 同时存在时, docker 把 CMD 的命令拼接到 ENTRYPOINT 命令之后, 拼接后的命令才是最终执行的命令.实战覆盖多次覆盖参数覆盖Shell VS Exec1. 我们编写下面的 Dockerfile3执行 ping 命令2. 然后编译镜像运行组合镜像制作常见问题1. ADD 与 COPY 的区别ADD不仅能够将构建命令所在的主机本地的文件或目录而且能够将远程 URL 所对应的文件或目录作为资源复制到镜像文件系统。所以可以认为 ADD 是增强版 的 COPY支持将远程 URL 的资源加入到镜像的文件系统。COPYCOPY 指令能够将构建命令所在的主机本地的文件或目录复制到镜像 文件系统。有的时候就是只需要拷贝压缩包那么我们就要用 COPY 指令了2. CMD 与 EntryPoint 的区别ENTRYPOINT 容器启动后执行的命令,让容器执行表现的像一个可执行程序一 样,与 CMD 的 区 别 是 不 可 以 被 docker run 覆 盖 , 会 把 docker run 后 面 的 参 数 当 作 传 递 给 ENTRYPOINT 指令的参数。Dockerfile 中只能指定一个 ENTRYPOINT,如果指定了很多,只 有 最 后 一 个 有 效 。 docker run 命 令 的 -entrypoint 参 数 可 以 把 指 定 的 参 数 继 续 传 递 给 ENTRYPOINT组合使用 ENTRYPOINT 和 CMD, ENTRYPOINT 指定默认的运行命令, CMD 指定默认的运行参数3. 多个 From 指令如何使用多个 FROM 指令并不是为了生成多根的层关系最后生成的镜像仍以最后一条 FROM 为准之前的 FROM 会被抛弃那么之前的 FROM 又有什么意义呢每一条 FROM 指令都是一个构建阶段多条 FROM 就是多阶段构建虽然最后 生成的镜像只能是最后一个阶段的结果但是能够将前置阶段中的文件拷贝到 后边的阶段中这就是多阶段构建的最大意义。最大的使用场景是将编译环境和运行环境分离.4. 快照和 dockerfile 制作镜像有什么区别等同于为什么要使用 Dockerfile。5. 什么是空悬镜像dangling 仓库名、标签均为none 的镜像被称为虚悬镜像一般来说虚悬镜像已经失去了存 在的价值是可以随意删除的。造成虚悬镜像的原因原因一原本有镜像名和标签的镜像发布了新版本后重新 docker pull *** 时旧的镜像名 被转移到了新下载的镜像身上而旧的镜像上的这个名称则被取消原因二docker build 同样可以导致这种现象。比如用 dockerfile1 构建了个镜像 tnone1:v1,又 用另外一个 Dockerfile2 构建了一个镜像 tnone1:v1这样之前的那个镜像就会变成空 悬镜像。可以用下面的命令专门显示这类镜像docker image ls -f danglingtrue6. 中间层镜像是什么为了加速镜像构建、重复利用资源Docker 会利用 中间层镜像。所以在使用一段时间 后可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示 顶层镜像如果希望显示包括中间层镜像在内的所有镜像的话需要加 -a 参数。docker image ls -a这样会看到很多无标签的镜像与之前的虚悬镜像不同这些无标签的镜像很多都是 中间层镜像是其它镜像所依赖的镜像。这些无标签镜像不应该删除否则会导致上 层镜像因为依赖丢失而出错。实际上这些镜像也没必要删除因为之前说过相同 的层只会存一遍而这些镜像是别的镜像的依赖因此并不会因为它们被列出来而多 存了一份无论如何你也会需要它们。只要删除那些依赖它们的镜像后这些依赖的 中间层镜像也会被连带删除。

相关新闻

STM32F103串口DMA+空闲中断收发实战:告别HAL_UART_Receive_IT丢包

STM32F103串口DMA+空闲中断收发实战:告别HAL_UART_Receive_IT丢包

简介:这份资源面向STM32F103嵌入式开发者,聚焦UART串口空闲中断收发这一实用技能,解决不定长度、无固定结束标志数据帧的高效接收问题。内容围绕空闲中断的配置思路展开,涵盖UART初始化、空闲中断开启、中断服务函数编写、NVIC优先…

2026/10/16 2:37:54 阅读更多 →
80C51单片机引脚与片内RAM/ROM存储结构详解

80C51单片机引脚与片内RAM/ROM存储结构详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 2:36:54 阅读更多 →
从零做一只原创软陶玩偶:沙耶的玩偶制作全流程解析

从零做一只原创软陶玩偶:沙耶的玩偶制作全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 2:36:54 阅读更多 →

最新新闻

FPGA高速安全状态机设计:编码、时序优化与安全机制

FPGA高速安全状态机设计:编码、时序优化与安全机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 4:28:20 阅读更多 →
基于MP2642GR-Z与PIC18F87J50的两串电池主动均衡方案设计与实现

基于MP2642GR-Z与PIC18F87J50的两串电池主动均衡方案设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 4:28:20 阅读更多 →
MNIST模型压缩实战:886个参数实现98.2%准确率

MNIST模型压缩实战:886个参数实现98.2%准确率

1. 项目缘起与核心思路拆解1.1 为什么要在 MNIST 上死磕参数量MNIST 手写数字识别大概是每个接触深度学习的人绕不开的第一个项目。LeNet-5 在 1998 年就能把它做到 99% 以上,现在随便搭一个三层卷积网络,几分钟训练就能摸到 99.2% 的准确率。也正因为如…

2026/10/16 4:28:20 阅读更多 →
深入理解Linux sync命令:从延迟写入到数据落盘

深入理解Linux sync命令:从延迟写入到数据落盘

1. 为什么需要sync:先看懂内核的延迟写入机制1.1 数据进入page cache之后发生了什么在Linux日常维护里,sync大概是看起来最不起眼的一个命令。它不像top、ps那样天天见,执行起来往往一秒不到就回到提示符,很多刚接触Linux的人甚至…

2026/10/16 4:28:20 阅读更多 →
前端导出Excel/CSV实战:从字符串拼接、Blob到大数据量性能优化

前端导出Excel/CSV实战:从字符串拼接、Blob到大数据量性能优化

1. 从一次数据交付事故说起:为什么前端导出不是“调个库”那么简单去年年底,我帮一个做运营后台的朋友处理过一个挺典型的烂摊子。他们的系统里有一个订单明细页,运营同事每天要把当天的数据导出来做二次分析。最初的做法是后端提供一个接口&…

2026/10/16 4:28:20 阅读更多 →
模板代码异常处理全攻略:从编译拦截到渲染降级

模板代码异常处理全攻略:从编译拦截到渲染降级

模板代码的异常处理,说难不难,说简单也不简单。我接过不少以模板渲染为核心的项目,从批量邮件通知、自动化报表到页面静态化,几乎每个项目在跑起来之后,第一波线上问题全出在模板这一层——变量名拼错、字段为空、循环…

2026/10/16 4:27:20 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →