使用 Kaniko来构建镜像
使用 Kaniko来构建镜像
Kaniko 是一种专注于容器镜像构建的开源工具,其核心设计理念与 Docker 存在显著差异。以下从功能定位、技术实现和适用场景三方面进行对比分析:
一、Kaniko 的核心特性
- 无需 Docker 守护进程
Kaniko 直接在容器或 Kubernetes 集群中运行,完全脱离 Docker 守护进程(Docker Daemon)。这种设计通过消除对特权模式的依赖,提升了安全性和资源利用率。 - 基于用户空间的构建流程
它会逐行解析 Dockerfile,提取基础镜像文件系统,并在用户空间内执行每条指令,通过快照比对生成镜像层,最后推送至镜像仓库。此过程避免了传统 Docker 构建中的权限依赖。 - 云原生场景优化
专为 Kubernetes 和 CI/CD 流水线设计,支持通过 Secret 挂载凭证,可直接集成到 Jenkins 等工具中,实现自动化构建。
二、与 Docker 的主要区别
对比维度 | Kaniko | Docker |
---|---|---|
架构依赖 | 无需 Docker Daemon,独立运行于容器环境 | 依赖 Docker Daemon 执行构建任务 |
安全性 | 容器隔离构建,避免挂载宿主机敏感文件 | 需挂载 /var/run/docker.sock ,存在特权风险 |
适用环境 | Kubernetes、无 Docker 环境的云原生场景 | 本地开发环境、传统 Docker 宿主机 |
构建效率 | 并行构建技术缩短时间,但受网络/缓存影响 | 本地构建速度快,但集群场景需额外配置 |
镜像推送 | 强制要求构建后推送至远程仓库 | 支持本地存储或手动推送 |
三、典型使用场景建议
- Kubernetes 集群内构建
当宿主机未安装 Docker 或需避免特权模式时(如 Kubernetes v1.24+ 默认使用 containerd),Kaniko 是更安全的选择。 - 高安全要求的 CI/CD 流水线
在 Jenkins 等工具中,通过 Pod 模板调用 Kaniko,可避免暴露宿主机 Docker 套接字,符合安全合规要求。 - 多平台镜像构建
支持--platform
参数指定目标架构(如linux/amd64
),适合跨平台交付场景。
四、性能注意事项
尽管 Kaniko 具备并行构建优势,但实际速度可能受基础镜像拉取延迟、缓存配置(如 --cache-repo
参数优化)和上下文传输方式(如 GCS/S3 存储桶)影响,需结合网络环境调优。
五、Kaniko的优势
Kaniko作为一个创新的容器镜像构建工具,在云原生时代提供了显著的优势,特别是在高效且灵活的容器镜像构建方面。以下是Kaniko的主要优势:
无守护进程构建
Kaniko无需Docker守护进程即可独立运行,这不仅节省了资源,还提高了构建效率。这种设计使得Kaniko在资源有限的环境中也能高效工作,特别是在Kubernetes集群或容器环境中。
安全隔离
Kaniko在单独的容器中执行构建,与宿主机系统隔离,从而增强了安全性。这种隔离机制可以有效防止潜在的安全威胁影响到宿主系统。
构建速度快
Kaniko使用并行构建技术,显著缩短了构建时间。这意味着用户可以在短时间内完成复杂的构建任务,节省宝贵的时间。
高度可定制
Kaniko允许用户定制构建过程,包括添加自定义脚本和修改构建环境,以满足特定的需求。这种灵活性使得Kaniko能够满足不同项目和环境的多样化需求。
易于集成
Kaniko可以轻松集成到CI/CD流水线中,实现自动构建和部署。这使得Kaniko成为持续集成和持续部署流程中的重要组成部分,提高了开发和部署的自动化水平。
在Kubernetes环境中的应用
Kaniko非常适合在Kubernetes环境中构建镜像,可以无缝集成,简化镜像构建和部署。这种集成方式不仅提高了效率,还增加了系统的可靠性。
对云原生应用的支持
Kaniko是云原生应用镜像构建的理想选择,可快速构建和部署,满足敏捷开发的要求。这种快速构建和部署的能力使得Kaniko在云原生应用的开发和运维中发挥着重要作用。
微服务架构的支持
Kaniko也适用于微服务架构的镜像构建,可独立构建每个微服务,实现高效的开发和部署。这种支持使得Kaniko在微服务架构的推广和应用中具有重要意义。
未来前景
随着云原生应用和微服务架构的发展,Kaniko的作用将越来越重要,成为构建容器镜像的标准工具,为开发者提供更快速、更安全、更定制化的构建体验。
综上所述,Kaniko以其无守护进程构建、安全隔离、快速构建、高度可定制、易于集成等优势,在容器镜像构建领域占据了重要地位,特别是在云原生和微服务架构的应用中,Kaniko展现出了巨大的潜力和价值。
kaniko 使用命令常用参数
说一下 kaniko 的使用 ,参数 其实和docker build 类似,需要知道 上下文 context
,dockerfile
的位置信息, destination
构建镜像完成后 要推送的地址 ,skip-tls-verify
跳过检查 https 以及配置缓存相关的。
// 构建镜像
def buildImage(Map config) {def kanikoCommand = '/usr/local/bin/executor ' +"--context dir://${config.WORKSPACE} " +"--dockerfile ${config.WORKSPACE}/Dockerfile " +"--destination ${config.IMAGE_TAG} " +'--skip-tls-verify ' +'--verbosity=info ' +'--cache=true ' +"--cache-repo ${config.DOCKER_REGISTRY}/cache-repo/${config.IMAGE_NAME} " +'--cache-ttl=168h ' +'--cache-dir=/kaniko/.cache 'echo "Building Docker image for ${config.envType} environment with Kaniko"try {echo "Current working directory: ${pwd()}"container('kaniko') {sh '''/usr/local/bin/executor version'''sh "${kanikoCommand}"}} catch (err) {error "Failed to build Docker image: ${err}"}
}
创建秘钥
配置 kaniko
使用 Docker 注册表凭证
kubectl create secret docker-registry regcred \--namespace=dev \--docker-server=172.19.89.106:12300 \--docker-username=admin \--docker-password=xxxxxxxxxx
这个命令是用来在 Kubernetes 集群中创建一个名为 regcred
的 Docker registry 类型的 Secret。这个 Secret 用于存储访问私有 Docker registry 所需的认证信息,以便 Kubernetes 能够拉取私有仓库中的镜像。具体来说,该命令的作用如下:
-
kubectl create secret docker-registry regcred
: 使用kubectl
命令行工具创建一个类型为docker-registry
的 Secret。regcred
是这个 Secret 的名称,您可以在需要引用此 Secret 时使用这个名字。 -
--namespace=dev
: 指定这个 Secret 应该被创建在哪个命名空间(namespace)中。这里指定的是dev
命名空间。Kubernetes 中的资源是按命名空间来组织的,这有助于对不同环境或团队的资源进行隔离。 -
--docker-server=172.19.89.106:12300
: 指定 Docker registry 的服务器地址。在这个例子中,它是一个位于172.19.89.106
的私有 Docker registry,并且监听着12300
端口。 -
--docker-username=admin
: 指定用于登录 Docker registry 的用户名。这里是admin
。 -
--docker-password=xxxxxxxxxx
: 指定与上述用户名关联的密码。这里是xxxxxxxxxx
。
创建了这个 Secret 后,您可以在 Pod 或其他 Kubernetes 资源定义中引用它,以确保 Kubernetes 在尝试从指定的 Docker registry 拉取镜像时能够提供正确的认证信息。例如,在 Pod 的定义中,您可以添加 imagePullSecrets
字段,并将 regcred
作为值之一,这样 Kubernetes 就知道使用这个 Secret 来获取必要的认证凭据。
kubectl get secret regcred -n dev -o yamlapiVersion: v1
data:.dockerconfigjson: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6ImFkbWluNzMxIiwiYXV0aCI6IllXUnRhVzQ2WVdSdGFXNDNNekU9In19fQ==
kind: Secret
metadata:creationTimestamp: "2025-04-10T06:29:02Z"name: regcrednamespace: devresourceVersion: "58990830"uid: f50b2868-1a0f-46e1-88c1-a8bc70c119b1
type: kubernetes.io/dockerconfigjson
在Pipeline 中的一个Stage 中
stage('Build CODE') {steps {script {String branchName = params.BRANCHString envType = params.ENVecho """\Build CODE:WORKSPACE: ${WORKSPACE}envType: ${envType}branchName: ${branchName}""".stripIndent()sh 'ls -al'/* groovylint-disable-next-line VariableTypeRequired */def String gitSha = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()def String currentDate = sh(returnStdout: true, script: 'date +%Y%m%d').trim()// 设置 IMAGE_TAG 环境变量 动态传值/* groovylint-disable-next-line LineLength */env.IMAGE_TAG = "${DOCKER_REGISTRY}/${IMAGE_NAME}/${SHORT_NAME}:${branchName}-${currentDate}-${gitSha}"// 打印 image tagecho "current tag: ${env.IMAGE_TAG}"// 构建镜像 和推送镜像buildImage([envType: envType,branchName: branchName,WORKSPACE: WORKSPACE,IMAGE_TAG: env.IMAGE_TAG,DOCKER_REGISTRY: DOCKER_REGISTRY,IMAGE_NAME: IMAGE_NAME,SHORT_NAME: SHORT_NAME])}}
}
#!/bin/bash # 重新打tag
docker tag gcr.io/kaniko-project/executor:v1.23.0 172.19.89.106:12300/library/kaniko-project/executor:v1.23.0docker login -uadmin -padmin-xxxxx-xxxx 172.19.89.106:12300docker push 172.19.89.106:12300/library/kaniko-project/executor:v1.23.0
把官方镜像 推送的私有仓库。 这个镜像 一旦开始启动 就停止了,不像其他镜像 可以一直常驻在前台,可以理解为 一次性容器我想在容器起来之后 ,根据需要 创建我的容器镜像 tag ,需要根据 时间或者分支名 组合生成,而不是传入一个destination 定义固定的值。
比如上面的例子中:TAG 生成逻辑,当前分支,当前日志,以及git提交的hash值
/* groovylint-disable-next-line VariableTypeRequired */
def String gitSha = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
def String currentDate = sh(returnStdout: true, script: 'date +%Y%m%d').trim()// 设置 IMAGE_TAG 环境变量 动态传值
/* groovylint-disable-next-line LineLength */
env.IMAGE_TAG = "${DOCKER_REGISTRY}/${IMAGE_NAME}/${SHORT_NAME}:${branchName}-${currentDate}-${gitSha}"
// 打印 image tag
echo "current tag: ${env.IMAGE_TAG}"
官方镜像改造
我对官方的镜像 进行了一点点改造
# 第一阶段:使用 kaniko 构建应用
FROM 172.19.89.106:12300/library/kaniko-project/executor:v1.23.0 AS builder
# FROM gcr.io/kaniko-project/executor:v1.23.0 AS builder# 第二阶段:使用一个适合运行时环境的基础镜像
FROM alpine:latest# 安装 busybox
RUN apk add --no-cache busybox# 创建一个符号链接,使得 /bin/sh 指向 busybox 的 sh
RUN ln -sf /bin/busybox /bin/sh# 从第一阶段复制 /kaniko/executor 到第二阶段
COPY --from=builder /kaniko/executor /usr/local/bin/executor
COPY --from=builder /kaniko/executor /kaniko/executor
# 将 /usr/local/bin 添加到 PATH(如果它还没有在 PATH 中)
ENV PATH=/kaniko:/usr/local/bin:$PATH# 设置默认的 ENTRYPOINT 和 CMD
ENTRYPOINT ["/usr/local/bin/executor"]CMD ["--help"]
# 重新构建镜像
docker build . -t 172.19.89.106:12300/library/kaniko-project/executor:v1.23.0-v1# 保存镜像 到文件
docker save -o executor-v1.tar 172.19.89.106:12300/library/kaniko-project/executor:v1.23.0-v1# 加载镜像
docker load -i executor.tar# 推送到 私有仓库中
docker push 172.19.89.106:12300/library/kaniko-project/executor:v1.23.0-v1
这样的好处 这样镜像中有了 sh
环境, 在启动容器的 时候, 我就可以通过
- name: kanikoimage: 172.19.89.106:12300/library/kaniko-project/executor:v1.23.0-v1imagePullPolicy: IfNotPresentcommand: ["/bin/sh"]args: ["-c", "tail -f /dev/null"] # 保持容器运行env:- name: DOCKER_CONFIG # 这个配置指向该卷来传递凭证value: /home/jenkins/agent/.dockervolumeMounts:- name: docker-configmountPath: /home/jenkins/agent/.docker- name: workspace-volumemountPath: /home/jenkins/agent- name: kaniko-cache # kaniko 缓存相关mountPath: /kaniko/.cachesecurityContext:runAsUser: 0resources:requests:memory: "1Gi" # 根据实际需求调整cpu: "500m" # 根据实际需求调整limits:memory: "2Gi"cpu: "1000m"volumes:- name: workspace-volumeemptyDir: {}- name: docker-configsecret:secretName: regcreditems:- key: .dockerconfigjsonpath: config.json- name: kaniko-cachepersistentVolumeClaim:claimName: kaniko-cache-pvc
把docker-config 挂载到 /home/jenkins/agent/.docker
这个目录下面,kanio 就可以有权限来推送镜像了。
通过tail -f
让容器 一直运行状态,之后 我需要执行构建镜像的时候 传入 镜像的名称即可。
六、Q&A : Kaniko 构建完成后 会自动推送镜像吗?
A: Kaniko
在构建完成后会自动推送镜像到指定的 Docker 注册表。这是 Kaniko
的一个关键特性之一,它不仅负责构建 Docker 镜像,还会将构建好的镜像推送到你指定的目标仓库。
是的,Kaniko
在构建完成后会自动推送镜像到指定的 Docker 注册表。这是 Kaniko
的一个关键特性之一,它不仅负责构建 Docker 镜像,还会将构建好的镜像推送到你指定的目标仓库。
具体工作原理
- 构建镜像:
Kaniko
会读取Dockerfile
并按照其中的指令逐层构建镜像。 - 推送镜像:在构建完成后,
Kaniko
会直接将构建好的镜像推送到你通过--destination
参数指定的 Docker 注册表。这个过程不需要与 Docker 守护进程交互,也不需要挂载 Docker Socket。
如何确保 Kaniko
推送镜像
为了确保 Kaniko
能够成功推送镜像,你需要满足以下条件:
-
提供有效的 Docker 注册表凭证:
Kaniko
需要访问 Docker 注册表的权限,因此你必须提供有效的用户名和密码(或令牌)。这通常通过 Kubernetes Secret 来实现。- 在 Jenkins Pipeline 中,我们通过挂载
docker-config
卷并将DOCKER_CONFIG
环境变量指向该卷来传递凭证。
-
正确设置
--destination
参数:-
--destination
参数指定了目标镜像的完整路径,包括注册表地址、仓库名称和标签。例如:--destination 172.19.89.106:12300/zhiexa-web-official/web-official:master-20241210-fd880b6
-
确保这个路径是正确的,并且你有权限推送镜像到该位置。
-
-
网络连接:
Kaniko
需要能够访问 Docker 注册表的网络地址。确保你的 Kubernetes 集群中的 Pod 可以访问外部网络或私有注册表的地址。
示例命令
在 Jenkins Pipeline 中,Kaniko
的调用命令如下:
sh """/kaniko/executor \--context dir://${WORKSPACE} \--dockerfile ${WORKSPACE}/Dockerfile \--destination ${env.IMAGE_TAG} \--build-arg BUILD_ENV=${envType}
"""
在这个命令中:
--context
指定了构建上下文的路径,通常是代码库的根目录。--dockerfile
指定了Dockerfile
的路径。--destination
指定了目标镜像的完整路径,Kaniko
会在构建完成后将镜像推送到这个位置。--build-arg
用于传递构建时的参数(如BUILD_ENV
)。
验证推送是否成功
你可以通过以下方式验证 Kaniko
是否成功推送了镜像:
-
日志输出:
Kaniko
会在控制台输出详细的构建和推送日志。如果你看到类似以下的日志,说明推送成功:Pushing layer sha256:xxxxxxxxxxxxx Pushing manifest for 172.19.89.106:12300/zhiexa-web-official/web-official:master-20241210-fd880b6 Successfully pushed 172.19.89.106:12300/zhiexa-web-official/web-official:master-20241210-fd880b6
-
检查注册表:你也可以手动登录到 Docker 注册表,查看是否已经有新镜像被推送。
注意事项
- 私有注册表:如果你使用的是私有 Docker 注册表,确保你已经正确配置了凭证,并且
Kaniko
有权限推送镜像。 - 防火墙和网络策略:确保 Kubernetes 集群中的网络策略允许 Pod 访问 Docker 注册表的地址。
- 镜像标签:确保你为镜像设置了唯一的标签(如基于 Git 提交哈希或构建时间),以避免覆盖旧版本的镜像。
总结
Kaniko
在构建完成后会自动推送镜像到指定的 Docker 注册表,而无需额外的推送步骤。只要确保提供了正确的凭证和网络访问权限,Kaniko
就可以顺利完成构建和推送任务。Kaniko 是不需要 Docker Daemon
比较适合K8S 环境来构建镜像。
参考文档
kanio github
相关文章:
使用 Kaniko来构建镜像
使用 Kaniko来构建镜像 Kaniko 是一种专注于容器镜像构建的开源工具,其核心设计理念与 Docker 存在显著差异。以下从功能定位、技术实现和适用场景三方面进行对比分析: 一、Kaniko 的核心特性 无需 Docker 守护进程 Kaniko 直接在容器或 Kubernetes 集…...
2025.05.17淘天机考笔试真题第三题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 奇偶平衡树分割问题 问题描述 K小姐是一位园林设计师,她设计了一个由多个花坛组成的树形公园。每个花坛中种植了不同数量的花…...
history模式:让URL更美观
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
算法:分治法
实验内容 在一个2kⅹ2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为特殊方格,且称该棋盘为一特殊棋盘。 显然,特殊方格出现的位置有4k 种情况,即k>0,有4k 种不同的特殊棋盘 棋盘覆盖:…...
豆粕ETF投资逻辑整理归纳-20250511
目录 一、什么是豆粕 基本概念 豆粕上游生产国 豆粕下游消耗方 二、豆粕ETF 概念 策略 展期操作 超额收益 行情波动 豆粕资产的低相关性 三、展期收益 Contango升水结构和Backwardation贴水结构 豆粕的贴水逻辑 还有哪些品种拥有长期的展期收益 四、其他相关信…...
使用 Python 连接 Oracle 23ai 数据库完整指南
方法一:使用 oracledb 官方驱动(推荐) Oracle 官方维护的 oracledb 驱动(原 cx_Oracle)是最新推荐方案,支持 Thin/Thick 两种模式。 1. 环境准备 pip install oracledb2. 完整示例代码 import oracledb import getpass from typing import Unionclass Oracle23aiConn…...
构建集成差异化灵巧手和先进机器人控制技术的自动化系统
介绍程序 1.流程分析 通过流程分析审查应用机器人自动化的可行性。 2.系统设计 选择合适的机器人(机械臂、夹持器、视觉系统等),并通过详细的任务分析设计最佳系统。 3.内部测试 建立内部测试平台并解决任何问题。 4.现场测试 现场设…...
题单:汉诺塔问题
题目描述 如下图所示,设有 nn 个大小不等的中空圆盘,按照从小到大的顺序叠套在立柱 A 上,另有两根立柱 B 和 C 。 现在要求把全部圆盘从 A 柱(称为源柱)移到 C 柱(称为目标柱),移动…...
Unable to get end effector tips from jmg
这个错误信息表明在使用MoveIt2时,moveit_visual_tools无法从关节模型组(Joint Model Group,简称JMG)中获取末端执行器(End Effector,简称EE)的尖端信息。这通常是因为配置文件中缺少相关信息&a…...
flutter flutter run 运行项目卡在Running Gradle task ‘assembleDebug‘...
flutter run --verbose在运行flutter run 可以看到是卡在哪一步 最重要的就是自己查看日志,具体哪一步有问题flutter run --verbose使用这个,运行了项目会将错误信息放在控制台 可能原因 静态资源问题如果:图片、字体文件等没有在pubspec.yam…...
STM32烧录程序正常,但是运行异常
一、硬件配置问题 BOOT引脚设置错误 STM32的启动模式由BOOT0和BOOT1引脚决定。若设置为从RAM启动(BOOT01,BOOT10),程序在掉电后无法保存,导致复位后无法正常运行。应确保BOOT00(从Flash启动)15。…...
TTS:F5-TTS 带有 ConvNeXt V2 的扩散变换器
1,项目简介 F5-TTS 于英文生成领域表现卓越,发音标准程度在本次评测软件中独占鳌头。再者,官方预设的多角色生成模式独具匠心,能够配置多个角色,一次性为多角色、多情绪生成对话式语音,别出心裁。 最低配置…...
ecmascript 第6版特性 ECMA-262 ES6
https://blog.csdn.net/zlpzlpzyd/article/details/146125018 在之前写的文章基础上,ES6在export和import的基础外,还有如下特性 特性说明let/const块级作用域变量声明>箭头函数Promise异步编程...
2024 山东省ccpc省赛
目录 I(签到) 题目简述: 思路: 代码: A(二分答案) 题目简述: 思路: 代码: K(构造) 题目: 思路: 代…...
角点特征:从传统算法到深度学习算法演进
1 概述 图像特征是用来描述和分析图像内容的关键属性,通常包括颜色、纹理和形状等信息。颜色特征能够反映图像中不同颜色的分布,常通过 RGB 值或色彩直方图表示。纹理特征则关注图像表面的结构和细节,例如通过灰度共生矩阵或局部二值模式&…...
免费代理IP服务有哪些隐患?如何安全使用?
代理IP已经成为互联网众多用户日常在线活动中不可或缺的一部分。无论是为了保护个人隐私、突破地理限制,还是用于数据抓取、广告投放等商业用途,代理IP都扮演着关键角色。然而,市场上存在大量的免费代理IP服务,尽管它们看起来颇具…...
深入了解 VPC 端点类型 – 网关与接口
什么是VPC 端点 VPC 端点(VPC Endpoint)是 Amazon Web Services (AWS) 提供的一种服务,允许用户在 Virtual Private Cloud (VPC) 内部安全地访问 AWS 服务,而无需通过公共互联网。VPC 端点通过私有连接将 VPC 与 AWS 服务直接连接…...
Android屏幕采集编码打包推送RTMP技术详解:从开发到优化与应用
在现代移动应用中,屏幕采集已成为一个广泛使用的功能,尤其是在实时直播、视频会议、远程教育、游戏录制等场景中,屏幕采集技术的需求不断增长。Android 平台为开发者提供了 MediaProjection API,这使得屏幕录制和采集变得更加简单…...
信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)
个人笔记整理---仅供参考 计算题 案例分析里的计算题就是进度、挣值分析、预测技术。主要考査的知识点有:找关键路径、求总工期、自由时差、总时差、进度压缩资源平滑、挣值计算、预测计算。计算题是一定要拿下的,做计算题要保持头脑清晰,认真读题把PV、…...
全栈项目搭建指南:Nuxt.js + Node.js + MongoDB
全栈项目搭建指南:Nuxt.js Node.js MongoDB 一、项目概述 我们将构建一个完整的全栈应用,包含: 前端:Nuxt.js (SSR渲染)后端:Node.js (Express/Koa框架)数据库:MongoDB后台管理系统:集成在同…...
Linux:基础IO
一:理解文件 1-1 狭义理解 文件存储在磁盘中,由于磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的;磁盘也是外设,因此磁盘上对文件的所有操作本质是对外设的输入和输出 1-2 广义理解 Linux下一切皆文件&am…...
MySQL 索引优化以及慢查询优化
在数据库性能优化中,索引优化和慢查询优化是两个关键环节。合理使用索引可以显著提高查询效率,而识别和优化慢查询则能提升整体数据库性能。本文将详细介绍MySQL索引优化和慢查询优化的方法和最佳实践。 一、MySQL 索引优化 1.1 索引的基本概念 索引是…...
Leaflet使用SVG创建动态Legend
接前一篇文章,前一篇文章我们使用 SVG 创建了带有动态文字的图标,今天再看看怎样在地图上根据动态图标生成相关的legend,当然这里也还是使用了 SVG 来生成相关颜色的 legend。 看下面的代码,生成了一个 svg 节点,其中…...
使用 Vue Tour 封装一个统一的页面引导组件
项目开发过程中需要实现用户引导功能,经过调研发现一个好用的 Vue 插件 vue-tour,今天就来分享一下我是如何基于 vue-tour 封装一个统一的引导组件,方便后续在多个页面复用的。 📦 第一步:安装 vue-tour 插件 首先安装…...
OpenResty 深度解析:构建高性能 Web 服务的终极方案
引言 openresty是什么?在我个人对它的理解来看相当于嵌入了lua的nginx; 我们在nginx中嵌入lua是为了不需要再重新编译,我们只需要重新修改lua脚本,随后重启即可; 一.lua指令序列 我们分别从初始化阶段,重写/访问阶段,内容阶段,日志…...
赋能企业级移动应用 CFCA FIDO+提升安全与体验
移动办公与移动金融为企业有效提升业务丰富性、执行便捷性。与此同时,“安全”始终是移动办公与移动金融都绕不开的话题。随着信息安全技术的发展,企业级移动应用中安全与便捷不再是两难的抉择。 中金金融认证中心(CFCA)作为经国…...
Redis 数据类型与操作完全指南
Redis 是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。与传统的关系型数据库不同,Redis 提供了丰富的数据类型和灵活的操作方式,这使得它能够高效地解决各种不同场景下的数据存储和处理问题。本文将全面介绍 R…...
ArrayList-集合使用
自动扩容,集合的长度可以变化,而数组长度不变,集合更加灵活。 集合只能存引用数据类型,不能直接存基本数据类型,除非包装 ArrayList会拿[]展示数据...
深入解析Spring Boot与Redis集成:高效缓存实践
深入解析Spring Boot与Redis集成:高效缓存实践 引言 在现代Web应用开发中,缓存技术是提升系统性能的重要手段之一。Redis作为一种高性能的键值存储数据库,广泛应用于缓存、会话管理和消息队列等场景。本文将详细介绍如何在Spring Boot项目中…...
8天Python从入门到精通【itheima】-11~13
目录 11节-PyCharm的安装和基础使用: 1.第三方IDE(集成开发工具) 2.PyCharm的所属——jetbrains公司 3.进入jetbrains的官网,搜索下载【官网自带中文,太友好了,爱你(づ ̄3&#x…...
day33-网络编程
1. 网络编程入门 1.1 网络编程概述 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统…...
CMake基础及操作笔记
CMake 基础与操作:从入门到精通 前言 CMake 是一个功能强大、跨平台的构建工具,广泛用于 C 项目管理。它通过简洁的配置文件(CMakeLists.txt)描述编译过程,生成适用于不同平台的构建脚本(如 Makefile 或 …...
使用lvm进行磁盘分区
使用lvm进行磁盘分区 目的: 使用/dev/vdb创建一个5g的逻辑卷挂载到/mnt/lvmtest 前提: /dev/vdb是一块干净的空磁盘,数据会被清空!!! 1. 创建物理卷(PV): pvcreate /dev/sdb2. 验证…...
Java的线程通信机制是怎样的呢?
核心观点:线程通信本质是状态同步与数据传递的协同控制 (类比测试团队协作:如同测试用例执行需要同步进度,测试数据需要跨线程传递) 一、基础通信机制(附测试验证方法) 1. 共享内存(最常用但最危险) // 测试典型场景:多线程统计测试用例通过率 public class Share…...
线性回归策略
一种基于ATR(平均真实范围)、线性回归和布林带的交易策略。以下是对该策略的全面总结和分析: 交易逻辑思路 1. 过滤条件: - 集合竞价过滤:在每个交易日的开盘阶段,过滤掉集合竞价产生的异常数据。 - 价格异常过滤:排除当天开盘价与最高价或最低价相同的情况,这…...
Sparse4D运行笔记
Sparse4D有三个版本,其中V1和V2版本的官方文档中环境依赖写得比较模糊且依赖库有版本冲突。 1. Sparse4D V1 创建环境 conda create sparse4dv1 python3.8 激活环境 conda activate sparse4dv1 安装torch, torchvision, torchaudio pip install torch1.13.0c…...
Bitmap、Roaring Bitmap、HyperLogLog对比介绍
一、Bitmap(位图)概述 Bitmap 是一种用位(bit)来表示集合元素是否存在的数据结构。每个位代表一个元素的状态(0或1),非常节省空间且支持快速集合操作。 常见Bitmap类型: 普通Bitmap 最简单的位数组,适合元素范围固定且不稀疏的场景。例如,元素范围是0~1000,用1001…...
Rust 数据结构:HashMap
Rust 数据结构:HashMap Rust 数据结构:HashMap创建一个新的哈希映射HashMap::new()将元组变成哈希表 访问哈希映射中的值哈希映射和所有权更新哈希映射重写一个值仅当键不存在时才添加键和值基于旧值更新值 散列函数 Rust 数据结构:HashMap …...
Spring6学习及复习笔记
1、快速入门认识 通过编写xml配置文件来创建对象,读取bean标签的id值和class值来创建。 之后再通过对象调用相关的方法(这里实际上用到的是反射机制) 对象会存放到Map集合中 大致反射思路如下:(这里只是模拟&#x…...
开源语音-文本基础模型和全双工语音对话框架 Moshi 介绍
介绍 一、项目背景 Moshi是一种语音-文本基础模型和全双工语音对话框架。它使用了Mimi这一业界领先的流式神经音频编解码器。Mimi能够以完全流式处理的方式(80毫秒的延迟,即帧大小),将24千赫兹的音频信号压缩为12.5赫兹的表示形式…...
MATLAB学习笔记(六):MATLAB数学建模
MATLAB 是数学建模的强大工具,其丰富的函数库和可视化能力可以高效解决各类数学建模问题。以下是 MATLAB 数学建模的完整指南,涵盖建模流程、常用方法、代码示例及实际应用。 一、数学建模的基本流程 问题分析 • 明确目标(预测、优化、分类等…...
博客打卡-求解流水线调度
题目如下: 有n个作业(编号为1~n)要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi(1≤i≤n)。 流水…...
【Ragflow】22.RagflowPlus(v0.3.0):用户会话管理/文件类型拓展/诸多优化更新
概述 在历经三周的阶段性开发后,RagflowPlus顺利完成既定计划,正式发布v0.3.0版本。 开源地址:https://github.com/zstar1003/ragflow-plus 新功能 1. 用户会话管理 在后台管理系统中,新增用户会话管理菜单。在此菜单中&…...
深度学习中ONNX格式的模型文件
一、模型部署的核心步骤 模型部署的完整流程通常分为以下阶段,用 “跨国旅行” 类比: 步骤类比解释技术细节1. 训练模型学会一门语言(如中文)用 PyTorch/TensorFlow 训练模型2. 导出为 ONNX翻译成国际通用语言(如英语…...
【机器人】复现 WMNav 具身导航 | 将VLM集成到世界模型中
WMNav 是由VLM视觉语言模型驱动的,基于世界模型的对象目标导航框架。 设计一种预测环境状态的记忆策略,采用在线好奇心价值图来量化存储,目标在世界模型预测的各种场景中出现的可能性。 本文分享WMNav复现和模型推理的过程~ 下…...
C++中析构函数不设为virtual导致内存泄漏示例
一、问题示例 #include <iostream> using namespace std;class Base { public:Base() { cout << "Base constructor\n"; }~Base() { cout << "Base destructor\n"; } // 不是 virtual };class Derived : public Base { public:Derived(…...
UDP--DDR--SFP,FPGA实现之模块梳理及AXI读写DDR读写上板测试
模块梳理介绍 在之前的几篇文章中,笔者详细介绍了整个项目的框架结构以及部分关键模块的实现细节。这些模块包括UDP协议栈、UDP指令监测、数据跨时钟域处理、DDR读写控制、内存读取控制以及DDR AXI控制器等。这些模块共同构成了项目的基础架构,每个模块…...
Slidev集成Chart.js:专业数据可视化演示文稿优化指南
引言:为何选择在Slidev中集成Chart.js? 在现代演示文稿中,高效的数据可视化对于清晰传达复杂信息至关重要。Slidev是一款灵活的开源演示文稿工具,基于Web技术构建,但在高级数据可视化方面存在一定局限。本文旨在提供一…...
动态规划(3)学习方法论:构建思维模型
引言 动态规划是算法领域中一个强大而优雅的解题方法,但对于许多学习者来说,它也是最难以掌握的算法范式之一。与贪心算法或分治法等直观的算法相比,动态规划往往需要更抽象的思维和更系统的学习方法。在前两篇文章中,我们介绍了动态规划的基础概念、原理以及问题建模与状…...
NDS3211HV单路H.264/HEVC/HD视频编码器
1产品概述 NDS3211HV单路高清编码器是一款功能强大的音/视频编码设备,支持2组立体声,同时还支持CC(CVBS)字幕。支持多种音频编码方式。该设备配备了多种音/视频输入接口:HD-SDI数字视频输入、HDMI高清输入(支持CC)、A…...