【Docker基础-镜像】--查阅笔记2
目录
- Docker镜像概述
- base镜像
- 镜像的分层结构
- 镜像的理解
- 镜像的构建
- docker commit 制作镜像
- Dockerfile
- Dockerfile 指令
- FROM
- LABEL
- RUN
- ARG
- ENV
- ADD
- COPY
- WORKDIR
- USER
- VOLUME
- EXPOSE
- CMD 和 ENTRYPOINT
Docker镜像概述
- 镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器。
- 镜像是一种轻量级、可执行的独立软件包,包含运行某个软件所需的所有内容,一个可交付的运行环境(包括代码、运行时所需的库、环境变量和配置文件等)
base镜像
- 不依赖其他镜像,从scratch构建(指完全从零开始创建镜像,不依赖任何现有操作系统层或工具链);比如各种Linux发行版本的Docker镜像,CentOS、Ubuntu等
- 其他镜像可以已之为基础进行扩展
从 scratch 构建镜像是对 Docker 镜像分层的极致利用,通过剥离冗余内容实现“仅需即所得”。但需权衡开发调试的便利性,适合对安全、体积敏感且技术栈可控的场景。
与常规基础镜像的区别
对比项 | scratch | Alpine/Centos |
---|---|---|
文件系统 | 完全空白 | 包含最小化的 Linux 发行版 rootfs |
镜像体积 | 仅包含用户添加的文件(可低至几 KB) | 通常 5MB(Alpine)至 200MB(CentOS) |
适用场景 | 静态编译的单一程序 | 需要系统工具或动态库支持的复杂应用 |
镜像的分层结构
Docker支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。新镜像是从base镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。
- Docker镜像实际上由一层层的文件系统组成,这种层级的文件系统就是 UnionFS
- bootfs(boot file system) 主要包括 bootloader 和 kernel,bootloader 主要是引导加载 kernel,Docker镜像的最底层就是引导文件 bootfs。
- rootfs(root file system),在bootfs之上,就是 Linux 系统的 /dev、/proc、/etc 等标准目录和文件。rootfs 就是各种不同操作系统发行版,如:ubuntu、centos 等。
为什么使用这种分层结构?
最大好处就是共享资源,方便复制迁移
镜像的理解
- 当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为容器层,容器层之下的都叫镜像层。
- 容器的Copy-on-Write特性,使得对文件的修改会被限制在单个容器内。
- 所有对容器的改动,无论添加、删除,还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。
镜像的构建
docker commit 制作镜像
docker commit命令是创建新镜像最直观的方法,其过程包含三个步骤:
- 运行容器
- 修改容器
- 将容器保存为新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:TAG
Docker并不建议用户通过这种方式构建镜像。原因如下:
- 手动创建,容易出错,效率低且可重复性弱
- 使用者并不知道镜像是如何创建出来的,里面是否有恶意程序,无法对镜像进行审计,存在安全隐患。
Dockerfile
Dockerfile是一个文本文件,记录了镜像构建的所有步骤,类似于 Linux 中的 Shell 脚本文件。推荐使用这种方式构建镜像,其实它的底层也是docker commit一层一层构建新镜像的。
docker build --no-cache --force-rm -t 镜像名称:TAG .
# --no-cache : 表示构建的时候不使用之前的缓存
# --force-rm:删除构建过程中的中间容器层
# .:表示构建环境的上下文,通常而言是 . ,表示以 Dockerfile 所在的目录作为构建的起点
- 每条保留字指令都必须为大写字母,且后面跟至少一个参数
- 指令从上到下依次执行
- #表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
Docker 执行 Dockerfile 的大致流程:
- 从基础镜像上运行一个容器
- 执行一条指令并对容器进行修改
- 执行类似 docker commit 的操作提交一个新的镜像层
- Docker 再基于刚才提交的镜像运行一个新的容器
- 依次类推,直到 Dockerfile 文件中的指令全部执行完成
Dockerfile 指令
FROM
指定基础镜像。eg:如果是 JS 模块化应用,可以选择 nodejs 基础镜像;FROM nodejs:18.20.1
LABEL
用来标注镜像的一些说明信息,常常用来指定维护者的信息。eg: LABEL maintainer=xxx
RUN
- 在当前镜像层顶部的新层执行任何命令,并提交结果,生成新的镜像层(多个 RUN 指令都是在同一个目录操作的)
- 生成的提交镜像将用于 Dockerfile 中的下一步,分层运行 RUN 指令并生成提交符合 Docker 的核心概念
- 由于 [] 不是 shell 形式,所以不能输出变量信息,而是输出 $msg 。其他任何 /bin/sh -c 的形式都可以输出变量信息
构建期是指使用 Dockerfile 构建镜像的整个过程时期,如:docker build 等。
运行期是指使用之前构建的镜像启动容器的过程,如:docker start 、docker run 等。
# shell 形式,/bin/bash -c 的方式运行,可以破坏 shell 字符串 eg:RUN /bin/sh -c 'echo $msg'
RUN <command>
# exec 的形式 eg:RUN ["/bin/sh","-c","echo $msg"]
RUN ["executable", "param1", "param2"]
# 在 RUN 中可以使用 \ 将一条 RUN 指令继续到下一行。
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
# 等同于
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
ARG
- 定义一个变量,可在构建时使用 --build-arg name=value 传递,docker build 命令会将其传递给构建器
- –build-arg 指定参数会覆盖 Dockerfile 中指定的同名参数
- 如果用户指定了 未在 Dockerfile 中定义的构建参数 ,则构建会输出 警告
- ARG 只在构建时期有效,运行时期无效
- 不建议使用构建时变量来传递注入 github 密码、用户凭据等机密,因为构建时变量的值可以通过 docker history 来观察到
- ARG 变量定义从 Dockerfile 定义的行开始生效
- 使用 ENV 指定定义的环境变量始终会覆盖同名的 ARG 指令
# 语法
ARG name=defaultValueARG param="Hi Docker"
RUN echo ${param}
ENV
- 跟 ARG 类似,但是 ENV 在构建期和运行期都有效,并且使用 ENV 指定定义的环境变量始终会覆盖同名的 ARG 指令
- 可以使用 docker run -e name=value 修改 ENV 定义的环境变量
- ENV 在构建期就会被解析并持久化,可以通过 docker inspect image 查看
# 语法
ENV name=valueENV app=taobao
ADD
- 将上下文指定的内容添加(复制)到镜像中,如果是压缩包,会自动解压;如果是远程 URL,会自动下载;但是 ADD 并没有自动下载远程压缩文件并解压的功能
src 路径必须在构建的上下文,不能使用 …/…/xxx 这种方式,因为 Docker 构建的第一步是将上下文目录(包括子目录)发送给 Docker 的守护进程
如果 src 是 URL ,并且 dest 不以 / 结尾,那么就会从 URL 下载文件并将其复制为 dest(名称)
如果 src 是 URL ,并且 dest 以 / 结尾,会自动推断出文件的名称(URL 的最后一部分)并保存到 dest(目录)中
如果 src 是目录,则将复制目录的整个内容,包括文件系统元数据
# 语法
ADD src destADD https://download.redis.io/releases/redis-6.2.6.tar.gz /dest
ADD redis-6.2.6.tar.gz /dest/
COPY
- COPY 和 ADD 类似,但是,没有像 ADD 的自动下载和解压压缩文件的功能
- –chown 功能仅在用于构建 Linux 容器的 Dockerfile 上受支持,而在 Windows 容器上不起作用
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
WORKDIR
- 为 Dockerfile 中跟随它后面的 RUN、CMD、ENTRYPOINT、COPY、ADD 指令设置工作目录
- 可在 Dockerfile 中多次使用。如果提供了相对路径,则它将相对于上一个 WORKDIR 指令的路径
WORKDIR /a/b/c
# 路径 /a/b/c
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# 路径 /path/$DIRNAME
ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
USER
- USER 指令和 WORKDIR 指令类似,都是改变环境状态并影响以后的层,WORKDIR 是改变工作目录,USER 则是改变之后层的执行 RUN 、CMD 、以及 ENTRYPOINT 这类命令的身份
- USER 只是帮助我们切换到指定的用户而已,这个用户必须事先建立好的,否则无法切换
USER <user>[:<group>]
USER <UID>[:<GID>]USER test:test
VOLUME
- 挂载 容器指定的文件夹,如果不存在,会自动创建
- 指定了 VOLUME 指令后,即使启动容器的时候没有指定 -v 参数,也会自动进行匿名卷挂载
- 用 VOLUME 声明了卷,那么以后对于卷内容的修改会被丢弃,所以,一定要在 volume 声明之前修改内容
# JSON数组形式
VOLUME ["/var/log/"]
# 直接写
VOLUME /var/log
# 空格分割多个
VOLUME /var/log /var/db
EXPOSE
- 通知 Docker 容器在运行的时候在指定的网络端口上进行侦听,可以指定端口是侦听 TCP 还是 UDP ,如果没有指定,默认就是 TCP
- 实际上不会发布端口,它充当了构建镜像人员和运行容器人员之间的一种文档,即打算发布那些端口的信息,要在运行容器时映射端口,需要使用 docker run -p xxx:xxx 或 docker run -P 的命令。
EXPOSE <port> [<port>/<protocol>...]EXPOSE [80,443]
EXPOSE 80/tcp
CMD 和 ENTRYPOINT
- Dockerfile 文件中,使用多个 CMD 或 ENTRYPOINT 作为唯一的入口,即写多个 CMD 或 ENTRYPOINT ,则会产生覆盖现象,只有最后一个生效
- shell 方式是可以读取环境变量的值的(如:${xxx}),默认情况下,exec 的方式是读取不了环境变量值的,但是 exec 方式的 [“/bin/sh”,”-c”,”xxx”] 等同于 shell 方式,也是可以读取环境变量值
- 推荐使用 RUN 、CMD 以及 ENTRYPOINT 使用 exec 的方式
- 既有 CMD 的 exec 方式,又有 ENTRYPOINT 的 exec 方式,那么 CMD 是作为 ENTRYPOINT 的参数的
- 使用 docker run -d xxx CMD 命令是可以覆盖 Dockerfile 中的 CMD 指令的,不是覆盖 exec 方式数组中的一个,而是全部
如果docker run指定了其他命令,CMD指定的默认命令将被忽略
ENTRYPOINT看上去与CMD很像,它们都可以指定要执行的命令及其参数。不同的地方在于ENTRYPOINT不会被忽略,一定会被执行,即使运行docker run时指定了其他命令
# exec 方式, 首选方式
CMD ["executable","param1","param2"]
# shell 形式
CMD command param1 param2
# exec 方式, 首选方式
ENTRYPOINT ["executable", "param1", "param2"]
# shell 形式
ENTRYPOINT command param1 param2# docker run -it [image] 启动时 输出: Hello world
# docker run -it [image] JS 启动时 输出: Hello JS
ENTRYPOINT ["/bin/echo", "Hello"] CMD ["world"]
相关文章:
【Docker基础-镜像】--查阅笔记2
目录 Docker镜像概述base镜像镜像的分层结构镜像的理解镜像的构建docker commit 制作镜像DockerfileDockerfile 指令FROMLABELRUNARGENVADDCOPYWORKDIRUSERVOLUMEEXPOSECMD 和 ENTRYPOINT Docker镜像概述 镜像是Docker容器的基石,容器是镜像的运行实例,…...
LeetCode 第47题:旋转数组
LeetCode 第47题:旋转数组 题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例1: 输入…...
数据库管理工具实战:IDEA 与 DBeaver 连接 TDengine(二)
五、DBeaver 连接 TDengine 实战 5.1 安装 DBeaver 下载安装包:访问 DBeaver 官方网站(https://dbeaver.io/download/ ),根据你的操作系统选择合适的安装包。如果是 Windows 系统,下载.exe 格式的安装文件࿱…...
4S店汽车维修保养管理系统 (源码+lw+部署文档+讲解),源码可白嫖!
摘要 二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式已经与当今4S店汽车维修保养管理系统的业务需求不相适应,也与4S店汽车维修保养管理系统化建设的发展趋势不相适应。本文针对这一需求设计并实现了…...
【Mysql】主从复制部署(保姆级)
本次部署用到三台Ubuntu虚拟机(一主两从): Master服务器:192.168.166.107 Slave1服务器:192.168.166.101 Slave2服务器:192.168.166.103 一、部署思路 首先我们要先捋清主从复制的部署思路…...
华为AR1200密码忘记
1、通过Console口连接设备并重启设备。在设备启动过程中,看到提示信息“Press CtrlB to break auto startup...”时,在三秒内按下CtrlB,输入BootLoader密码后,默认密码:Adminhuawei ,进入BootLoader主菜单…...
高级java每日一道面试题-2025年3月26日-微服务篇[Nacos篇]-在Spring Cloud项目中如何集成Nacos?
如果有遗漏,评论区告诉我进行补充 面试官: 在Spring Cloud项目中如何集成Nacos? 我回答: 在Spring Cloud项目中集成Nacos,可以充分利用Nacos作为服务注册与发现中心以及配置管理中心的功能。以下是详细的步骤和说明,帮助你完成这一集成过程…...
YOLO-LLTS:低光照实时交通标志检测算法详解
论文地址:https://arxiv.org/pdf/2503.13883 目录 一、论文概述 1.1 研究背景 1.2 论文结构 二、核心创新点 2.1 CNTSSS数据集 2.2 HRFM-TOD模块 2.3 MFIA模块 2.4 PGFE模块 三、实验与结果 3.1 实验设置 3.2 性能对比 编辑3.3 消融实验 四、代码复现建议 4.…...
golang 性能优化分析工具 pprof
pprof简介 pprof 是 Go 语言标准库提供的一个强大的性能分析工具,它能帮助开发者深入了解程序的运行时行为,找出性能瓶颈,进而对代码进行优化。下面从多个方面对 pprof 进行详细介绍: 主要功能 CPU 性能分析:能够记…...
机器学习 Day09 线性回归
1.线性回归简介 线性回归知识讲解 定义与公式 定义:线性回归是利用回归方程(函数)对自变量(特征值)和因变量(目标值)之间关系进行建模的分析方式 。自变量只有一个时是单变量回归,…...
2025高频面试算法总结篇【字符串】
文章目录 直接刷题链接直达如何找出一个字符串中的最大不重复子串给定一个数,删除K位得到最大值字符串的排列至少有K个重复字符的最长子串 直接刷题链接直达 如何找出一个字符串中的最大不重复子串 滑动窗口 --> 滑动窗口直到最后一个元素,每当碰到重…...
JavaScript性能优化(上)
1. 减少 DOM 操作 减少 DOM 操作是优化 JavaScript 性能的重要方法,因为频繁的 DOM 操作会导致浏览器重绘和重排,从而影响性能。以下是一些具体的策略和技术,可以帮助有效减少 DOM 操作: 1.1. 批量更新 DOM 亲切与母体ÿ…...
数据结构与算法——链表OJ题详解(1)
文章目录 一、前言二、OJ题分享2.1移除链表元素——非val尾插法2.2反转链表2.2.1头插法2.2.2三指针法 2.3链表的中间结点——快慢指针法2.4合并两个有序链表2.4.1空链表法2.4.2非空链表法 2.5链表的回文结构2.5.1投机取巧数组法2.5.2反转链表法 三、总结 一、前言 前几天博主已…...
sedex认证2025年变化重点
近日,SEDEX突然宣布:2025年7月1日起,全通知审核正式退出历史舞台,取而代之的是至少3周窗口期的半通知突击审核。这场被业内称为“供应链透明化革命”的调整,或将重塑全球工厂合规生态。 三大变化划重点: 1…...
Scala课后总结(8)
集合计算高级函数 过滤(filter) 从集合里挑出符合特定条件元素组成新集合 。比如从整数集合里选出偶数, list.filter(x > x % 2 0) ,就是筛选出能被2整除的元素。 转化/映射(map) 对集合每个元素应…...
老硬件也能运行的Win11 IoT LTSC (OEM)物联网版
#记录工作 Windows 11 IoT Enterprise LTSC 2024 属于物联网相关的版本。 Windows 11 IoT Enterprise 是为物联网设备和场景设计的操作系统版本。它通常针对特定的工业控制、智能设备等物联网应用进行了优化和定制,以满足这些领域对稳定性、安全性和长期支持的需求…...
蓝桥杯冲刺题单--二分
二分 知识点 二分: 1.序列二分:在序列中查找(不怎么考,会比较难?) 序列二分应用的序列必须是递增或递减,但可以非严格 只要r是mid-1,就对应mid(lr1)/2 2.答…...
计网 2025/4/8
CDMA? CRC循环冗余检验 PPP协议的帧格式 字节填充(异步传输、7E->7D5E)零比特填充(同步传输、确保不会出现连续6个1) CSMA/CD协议 多点接入载波监听碰撞检测 一些概念: 争用期 一些公式: 最短有效帧…...
java设计模式-工厂模式
工厂模式 简单工厂模式 请看类: org.xwb.springcloud.factory.simple.PizzaStore 1、简单工厂模式是属于创建型模式,是工厂模式的一种,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实力。简单来工厂模式就是工厂模式家族中最简单最…...
2025年客运从业资格证备考刷题题库
题库中通常包含大量的题目,以全面覆盖考试的知识点。通过做大量的题目,考生可以熟悉各种考试题型和命题方式,提高答题的速度和准确性,同时也能发现自己在知识掌握上的薄弱环节,有针对性地进行复习和强化训练。 1、驾驶…...
Zephyr、FreeRTOS、RT-Thread 任务创建对比分析
一、任务模型与核心概念 特性ZephyrFreeRTOSRT-Thread任务术语线程(Thread)任务(Task)线程(Thread)执行单元线程(单地址空间)任务(共享内存空间)线程&#x…...
RK-realtime Linux
rk3562实时性数据:最大76us rk3568实时性数据:最大126us rk3588实时性数据:最大30us 注意事项 (1)RK3568 需要使用RT版本的BL31,实时性能更好 a)rkbin需要更新到最新,且包含这个补丁:...
Ubuntu 22 Linux上部署DeepSeek+RAG知识库操作详解(Dify方式)之1
一、安装Docker 1. 更新你的包索引 首先,确保你的包列表是最新的。打开终端并运行以下命令: sudo apt update 2. 安装必要的依赖项 安装Docker之前,你需要安装一些必要的依赖项。运行以下命令来安装它们: sudo apt install apt…...
将飞帆制作的网页作为 div 集成到自己的网页中
并且自己的网页可以和飞帆中的控件相互调用函数。效果: 上链接 将飞帆制作的网页作为 div 集成到自己的网页中 - 文贝 进入可以复制、运行代码...
【C++游戏引擎开发】《几何算法》(3)AABB/OBB碰撞检测
一、AABB(轴对齐包围盒) 1.1 定义 最小点: m i n = ( x min , y min , z min ) \mathbf{min} = (x_{\text{min}}, y_{\text{min}}, z_{\text{min}}) min=(xmin,ymin,zmin)最大点: m a x = ( x max , y max , z max ) \mathbf{max} = (x_{\text{max}}, y_{\text{…...
基于人工智能的高中教育评价体系重构研究
基于人工智能的高中教育评价体系重构研究 一、引言 1.1 研究背景 在科技飞速发展的当下,人工智能技术已广泛渗透至各个领域,教育领域亦不例外。人工智能凭借其强大的数据处理能力、智能分析能力和个性化服务能力,为教育评价体系的创新与发…...
【C++游戏引擎开发】数学计算库GLM(线性代数)、CGAL(几何计算)的安装与使用指南
写在前面 两天都没手搓实现可用的凸包生成算法相关的代码,自觉无法手搓相关数学库,遂改为使用成熟数学库。 一、GLM库安装与介绍 1.1 vcpkg安装GLM 跨平台C包管理利器vcpkg完全指南 在PowerShell中执行命令: vcpkg install glm# 集成到系…...
Python 字典和集合(常见的映射方法)
本章内容的大纲如下: 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的 顺序,等等) 常见的映射方法 映射类型…...
Qt 自带的QSqlDatabase 模块中使用的 SQLite 和 SQLite 官方提供的 C 语言版本(sqlite.org)对比
Qt 自带的 QSqlDatabase 模块中使用的 SQLite 和 SQLite 官方提供的 C 语言版本(sqlite.org)在核心功能上是相同的,但它们在集成方式、API 封装、功能支持以及版本更新上存在一些区别。以下是主要区别: 1. 核心 SQLite 引擎 Qt 的…...
按键长按代码
这些代码都存放在定时器中断中。中断为100ms中断一次。 数据判断,看的懂就看吧...
zk源码—3.单机和集群通信原理一
大纲 1.单机版的zk服务端的启动过程 (1)预启动阶段 (2)初始化阶段 2.集群版的zk服务端的启动过程 (1)预启动阶段 (2)初始化阶段 (3)Leader选举阶段 (4)Leader和Follower启动阶段 1.单机版的zk服务端的启动过程 (1)预启动阶段 (2)初始化阶段 单机版zk服务端的启动&…...
车企数字化转型:从“制造工厂”到“移动科技平台”的升维路径
一、战略重构:政策与产业变革的双重倒逼 中国《智能网联汽车技术路线图2.0》明确要求2030年L4级自动驾驶新车渗透率达20%,而麦肯锡数据显示,全球车企数字化投入占比已从2018年的7%跃升至2025年的18%。当前车企面临三大核心挑战:用…...
C++-Mongoose(2)-https-server-openssl
OpenSSL生成HTTPS自签名证书 - 简书 1.Openssl windowsubuntu下载http://www.openssl.vip/download1.VS2019编译OpenSSL 2.VS2019编译第一个OpenSSL项目 1.ubuntu编译OpenSSL 3.0 2.编写第一个OpenSSL 1.windows下编译OpenSSL 安装vs2019 perl nasm安装activePerl…...
nginx正向代理https
一、需求 公司内部服务器向外访问腾讯接口:https://qyapi.weixin.qq.com/cgi-bin,不能使用http直接访问。并且不支持域名,还需要设置互联网出口-出向白名单ip。 如何在尽量少改动代码的情况下实现应用的出向访问链接,考虑使用正向…...
Flask中的蓝图(Blueprint)浅讲
BluePrint Flask中的蓝图(Blueprint)是一种强大的组织工具,能够将大型应用拆分为可重用的模块化组件 1. 模块化组织 用途:将应用按功能拆分为独立模块,提升代码可维护性。示例: # user/views.py fr…...
虚拟表、TDgpt、JDBC 异步写入…TDengine 3.3.6.0 版本 8 大升级亮点
近日,TDengine 3.3.6.0 版本正式发布。除了此前已亮相的时序数据分析 AI 智能体 TDgpt,本次更新还带来了多个针对性能与易用性的重要增强:虚拟表全面上线,支持更灵活的一设备一表建模;JDBC 写入机制全新升级࿰…...
大型语言模型智能应用Coze、Dify、FastGPT、MaxKB 对比,选择合适自己的LLM工具
大型语言模型智能应用Coze、Dify、FastGPT、MaxKB 对比,选择合适自己的LLM工具 Coze、Dify、FastGPT 和 MaxKB 都是旨在帮助用户构建基于大型语言模型 (LLM) 的智能应用的平台。它们各自拥有独特的功能和侧重点,以下是对它们的简要对比: Coz…...
WEB安全--XSS--DOM破坏
一、前言 继XSS基础篇后,我们知道了三种类型的XSS,这篇文章主要针对DOM型XSS的原理进行深入解析。 二、DOM型XSS原理 2.1、什么是DOM 以一个形象的比喻: 网页就像是一座房子,而 **DOM** 就是这座房子的“蓝图”或者“结构图”。…...
持续集成:GitLab CI/CD 与 Jenkins CI/CD 的全面剖析
一、引言 在当今快速迭代的软件开发领域,持续集成(Continuous Integration,CI)已成为保障软件质量、加速开发流程的关键实践。通过频繁地将代码集成到共享仓库,并自动进行构建和测试,持续集成能够尽早发现并解决代码冲突和缺陷。而 GitLab CI/CD 和 Jenkins CI/CD 作为两…...
Go语言sync.Mutex包源码解读
互斥锁sync.Mutex是在并发程序中对共享资源进行访问控制的主要手段,对此Go语言提供了非常简单易用的机制。sync.Mutex为结构体类型,对外暴露Lock()、Unlock()、TryLock()三种方法,分别用于阻塞加锁、解锁、非阻塞加锁操作(加锁失败…...
FreeRTOS软件定时器
软件定时器就是"闹钟",你可以设置闹钟, 用软件定时器的话USE_TIMER要设置为1 在30分钟后让你起床工作每隔1小时让你例行检查机器运行情况 软件定时器也可以完成两类事情: 在"未来"某个时间点,运行函数周期…...
Selenium三大等待
一、强制等待 1.设置完等待后不管有没有找到元素,都会执行等待,等待结束后才会执行下一步 2.实例: driver webdriver.Chrome()driver.get("https://www.baidu.com")time.sleep(3) # 设置强制等待driver.quit() 二、隐性等待 …...
【Ansible自动化运维】一、初步了解,开启自动化运维之旅
在当今数字化时代,随着企业 IT 基础设施规模的不断扩大,传统的手工运维方式逐渐显得力不从心。自动化运维技术应运而生,其中 Ansible 凭借其简洁易用、功能强大的特点,成为众多运维工程师和开发人员的首选工具。本篇文章将从基础概…...
雪花算法、md5加密
雪花算法生成ID是一个64位长整型(但是也可以通过优化简短位数) 组成部分: 时间戳 机器ID 序列号 用途: 分布式系统唯一ID生成:解决数据库自增ID在分布式环境下的唯一性问题、避免UUID的无序性和性能问题 有序性…...
micro介绍
micro介绍 Micro 的首要特点是易于安装(它只是一个静态的二进制文件,没有任何依赖关系)和易于使用Micro 支持完整的插件系统。插件是用 Lua 编写的,插件管理器可自动为你下载和安装插件。使用简单的 json 格式配置选项࿰…...
电视盒子 刷armbian
参考 中兴电视盒子中兴B860AV3.2-M刷Armbian新手级教程-CSDN博客 1.刷安卓9 带root版本 a. 下载安卓线刷包 链接:https://pan.baidu.com/s/1hz87_ld2lJea0gYjeoHQ8A?pwdd7as 提取码:d7as b.拆机短接 3.安装usbburning工具 使用方法 ,…...
(七)lerobot开源项目so100新版本全流程操作(操作记录)
目录 《项目简介》 一、环境配置 1、创建虚拟环境 2、克隆项目并安装所需包 二、主从臂硬件准备 1、舵机配置 (1)分别查看主从臂的开发板端口号 (2)分别设置主从臂的舵机 2、组装主从臂 3、查看主从臂端口号和相机端…...
智慧景区能源管理解决方案,为旅游“升温”保驾护航
景区能源管理 当下痛点 1 高峰期用电负荷大 节假日和旅游旺季等高峰期用电需求增大,电力供应不足、电网负荷过大; 2 设备维护困难 景区内电力设备多且散,包括发电机组、变电站、配电设备等,维护和管理困难,特别是…...
LCR 056. 两数之和 IV - 输入二叉搜索树
文章目录 题意思路代码 题意 题目链接 思路 代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), …...
AI搜索+法律咨询:在「事实重构」与「程序正义」的博弈场
已经写了股票和医疗相关的内容,今天聊一下AI搜索和法律结合的应用场景。AI搜索不替用户做选择,却让我们握住了法律武器的说明书。 一、AI重构事实:技术理想与法律现实的碰撞 1、案例切入:AI能否还原车祸责任比…...