当前位置: 首页 > news >正文

使用Docker启用MySQL8.0.11

目录

一、Docker减小镜像大小的方式

1、基础镜像选择

2、减少镜像层数

3、清理无用文件和缓存

4、优化文件复制(COPY和ADD指令)

二、Docker镜像多阶段构建

1、什么是dockers镜像多阶段构建

1.1 概念介绍

1.2 构建过程和优势

2、怎样在Dockerfile中实现多阶段构建

2.1 基本语法和步骤

2.2 示例:构建一个 Java 应用程序的多阶段镜像

2.3 注意事项

三、使用Dockerfile构建MySQL8.0.11

1、创建Dockerfile

2、启动新容器并创建用户

3、创建新容器并使用之前的数据


一、Docker减小镜像大小的方式

1、基础镜像选择

  • 选择合适的基础镜像:
    • 从官方仓库选择精简的基础镜像,如alpine。alpine是一个轻量级的 Linux 发行版,它的镜像体积通常很小。例如,构建一个 Python 应用,使用python:alpine作为基础镜像,相比python:ubuntu等镜像,体积会小很多。因为alpine在设计上注重小巧和简单,包含的软件包都是最基本的,没有过多的额外组件。
  • 基于特定场景定制基础镜像:
    • 如果对基础系统有特殊要求,可以基于更底层的基础镜像(如scratch)来构建。scratch是一个空白的镜像,几乎没有任何内容。这种情况下,需要自己将应用所需的最小运行时环境打包进去。例如,对于一个静态编译的 Go 程序,可以使用scratch作为基础镜像,将编译好的二进制文件直接复制到镜像中,这样构建出来的镜像体积会非常小。

2、减少镜像层数

  • 合并RUN指令:
    • 在Dockerfile中,每一个RUN指令都会创建一个新的镜像层。为了减少层数,应尽量合并相关的命令。例如,不要使用多个RUN指令分别安装软件包,而是将它们合并在一个RUN指令中。比如,不是这样写:
RUN apt-get update
RUN apt-get install -y package1
RUN apt-get install -y package2

3、清理无用文件和缓存

  • 在构建过程中清理缓存:
    • 对于基于apt(Debian/Ubuntu)或yum(CentOS 等)的系统,在安装完软件包后,清理软件包缓存。例如,在RUN指令中安装完apt - get软件包后,使用RUN apt-get clean来清理apt缓存。同样,对于yum,可以使用RUN yum clean all来清理yum缓存。这样可以减少镜像中不必要的文件占用空间。
  • 删除临时文件和无用文件:
    • 在构建过程中,如果生成了一些临时文件或者不再需要的文件,应该及时删除。例如,在编译软件时,可能会生成一些中间的编译文件,这些文件在软件安装完成后就不再需要,可以在Dockerfile中添加命令来删除它们。比如,在构建一个 C/C++ 应用的镜像时,在RUN指令中编译完程序后,可以使用RUN rm -rf /path/to/temporary/compilation/files来删除编译过程中的临时文件。

4、优化文件复制(COPY和ADD指令)

  • 只复制必要的文件:
    • 在使用COPY或ADD指令时,只复制应用真正需要的文件和目录到镜像中。避免将整个项目目录(包括开发工具、测试文件等)都复制进去。例如,如果是一个 Web 应用,只需要将生产环境下的 HTML、CSS、JavaScript 文件和服务器端代码复制到镜像中,而不需要复制开发过程中的单元测试文件等。
  • 使用.dockerignore文件:
    • 创建一个.dockerignore文件,在这个文件中列出不需要复制到镜像中的文件和目录模式。例如,如果项目目录中有.git文件夹(包含版本控制信息)、node_modules(对于 Node.js 应用,如果已经有package.json和package - lock.json,可以在镜像构建过程中重新安装依赖,不需要复制本地的node_modules)等,可以在.dockerignore文件中添加.git和node_modules,这样在构建镜像时,Docker会自动忽略这些文件和目录,从而减小复制到镜像中的文件体积。

二、Docker镜像多阶段构建

1、什么是dockers镜像多阶段构建

1.1 概念介绍

Docker 多阶段构建是一种在构建 Docker 镜像时使用的技术,它允许将镜像构建过程划分为多个不同的阶段。每个阶段都可以基于不同的基础镜像或者具有不同的构建目的,并且可以在不同阶段之间传递文件。通过这种方式,可以构建出更加精简、高效且安全的 Docker 镜像。

1.2 构建过程和优势

  • 减小镜像体积:
    • 在传统的单阶段构建中,如果要构建一个包含编译环境和运行环境的应用镜像,例如一个 Go 语言应用,构建过程中需要安装 Go 编译器和相关的编译工具来编译代码,同时还需要将运行应用所需的库和二进制文件打包到镜像中。这会导致镜像中包含大量的编译工具和中间文件,使镜像体积变大。
    • 而在多阶段构建中,可以先使用一个包含 Go 编译器的基础镜像来编译应用,生成可执行文件。然后在第二阶段,使用一个更精简的基础镜像(如alpine),只将编译好的可执行文件复制到这个镜像中,抛弃了编译环境相关的工具和文件,从而大大减小了最终镜像的体积。
  • 提高安全性:
    • 以一个包含敏感信息(如数据库连接密码)的应用为例。在单阶段构建中,如果构建过程中涉及到在镜像中设置密码等操作,这些敏感信息可能会留在最终的镜像中,存在安全风险。
    • 在多阶段构建中,可以在一个阶段(如开发环境阶段)处理敏感信息相关的操作,然后在构建最终生产环境镜像的阶段,只将必要的、经过处理的应用组件复制过来,避免敏感信息泄露到生产环境镜像中,提高了镜像的安全性。
  • 分离关注点:
    • 对于复杂的应用构建,不同的构建阶段可能有不同的目标。例如,在第一阶段进行代码编译、测试,在第二阶段进行打包和配置运行环境。多阶段构建可以清晰地将这些不同的关注点分开,使得构建过程更加易于理解和维护。
  • 示例
    • 以构建一个 Node.js 应用为例,第一阶段可以使用node:14 - builder(假设这是一个包含构建工具的 Node.js 镜像)来安装项目依赖并构建应用:
FROM node:14 - builder
WORKDIR /app
COPY package*.json./
RUN npm install
COPY..
RUN npm run build

2、怎样在Dockerfile中实现多阶段构建

2.1 基本语法和步骤

  • 多个FROM指令:
    • 在Dockerfile中,通过使用多个FROM指令来划分不同的构建阶段。每个FROM指令开始一个新的构建阶段,并且可以基于不同的基础镜像。例如,第一阶段可能基于一个包含编译工具的基础镜像,用于构建应用程序;第二阶段可以基于一个更精简的运行时基础镜像,用于运行最终的应用。
  • 阶段命名(可选):
    • 可以为每个阶段指定一个名称,这在需要引用特定阶段时非常有用。命名是在FROM指令后使用AS关键字来实现的。例如,FROM node:14 - builder AS builder_stage,这里将第一个阶段命名为builder_stage。
  • 文件复制(COPY或ADD)在阶段之间:
    • 使用COPY或ADD指令在不同阶段之间传递文件。关键是要使用--from选项来指定从哪个阶段复制文件。例如,COPY --from = builder_stage /app/dist.表示从名为builder_stage的阶段复制/app/dist目录下的文件到当前阶段的当前目录(.)。

2.2 示例:构建一个 Java 应用程序的多阶段镜像

  • 第一阶段:构建应用(使用maven构建工具):
FROM maven:3.8.4 - openjdk - 11 AS build
WORKDIR /app
COPY pom.xml.
RUN mvn dependency:go-off-line
COPY src./src
RUN mvn package - DskipTests

2.3 注意事项

  • 缓存利用:
    • 在多阶段构建中,每个阶段的构建缓存是独立的。Docker 会根据每个阶段的FROM指令和后续的构建指令来判断是否可以使用缓存。因此,合理安排构建顺序和指令内容可以更好地利用缓存,提高构建效率。
  • 基础镜像选择:
    • 每个阶段要根据其功能选择合适的基础镜像。如在编译阶段选择包含完整编译工具链的镜像,在运行阶段选择只包含运行时必要组件的镜像,这样才能充分发挥多阶段构建减小镜像体积的优势。

三、使用Dockerfile构建MySQL8.0.11

1、创建Dockerfile

# 使用官方MySQL 8.0镜像作为基础镜像
FROM mysql:8.0# 设置环境变量,用于初始化数据库
ENV MYSQL_DATABASE=db_name
ENV MYSQL_USER=user_name
ENV MYSQL_PASSWORD=user_password
ENV MYSQL_ROOT_PASSWORD=root_password# 复制初始化脚本到容器内
COPY ./init.sql /docker-entrypoint-initdb.d/# 容器将以daemon模式运行MySQL服务
CMD ["mysqld"]

命令示例:

cat >Dockerfile <<'eof'
FROM mysql:8.0.11
ENV MYSQL_DATABASE=MineGi
ENV MYSQL_USER=test11
ENV MYSQL_PASSWORD=123456
ENV MYSQL_ROOT_PASSWORD=666666
COPY ./init.sql /docker-entrypoint-initdb.d/
CMD ["mysqld"]
eofcat >init.sql <<'eof'
CREATE TABLE test11 (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
eofls
docker build -t mysql:v8 .

输出结果:

[root@MineGi ~]# cat >Dockerfile <<'eof'
> FROM mysql:8.0.11
> ENV MYSQL_DATABASE=MineGi
> ENV MYSQL_USER=test11
> ENV MYSQL_PASSWORD=123456
> ENV MYSQL_ROOT_PASSWORD=666666
> COPY ./init.sql /docker-entrypoint-initdb.d/
> CMD ["mysqld"]
> eof
[root@MineGi ~]# cat >init.sql <<'eof'
> CREATE TABLE test11 (
>     id INT AUTO_INCREMENT PRIMARY KEY,
>     username VARCHAR(50) NOT NULL,
>     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
> );
> eof
[root@MineGi ~]# ls
Dockerfile  init.sql
[root@MineGi ~]# docker build -t mysql:v8 .
[+] Building 0.1s (7/7) FINISHED                                                                                                   docker:default=> [internal] load build definition from Dockerfile                                                                                         0.0s=> => transferring dockerfile: 222B                                                                                                         0.0s=> [internal] load metadata for docker.io/library/mysql:8.0.11                                                                              0.0s=> [internal] load .dockerignore                                                                                                            0.0s=> => transferring context: 2B                                                                                                              0.0s=> [internal] load build context                                                                                                            0.0s=> => transferring context: 187B                                                                                                            0.0s=> [1/2] FROM docker.io/library/mysql:8.0.11                                                                                                0.0s=> CACHED [2/2] COPY ./init.sql /docker-entrypoint-initdb.d/                                                                                0.0s=> exporting to image                                                                                                                       0.0s=> => exporting layers                                                                                                                      0.0s=> => writing image sha256:10b79382712d1c5e721fd28cab3194c6818606784110fa68520bce220c33474d                                                 0.0s=> => naming to docker.io/library/mysql:v8                                                                                                  0.0s
[root@MineGi ~]# 

2、启动新容器并创建用户

命令示例:

docker run --name my_mysql -v mysql_data:/var/lib/mysql -d mysql:v8
docker exec -it my_mysql mysql -uroot -p666666
create user 'test-1'@'%' identified by '123456';
grant all on MineGi.* to 'test-1'@'%';
flush privileges;
exit
docker stop my_mysql
docker rm my_mysql

输出结果:

[root@MineGi ~]# docker run --name my_mysql -v mysql_data:/var/lib/mysql -d mysql:v8
c397aefbc2b61dba29ba48c3c32322058b052b5c45cd5c1c7162734d076bd09d
[root@MineGi ~]# docker exec -it my_mysql mysql -uroot -p666666
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.11 MySQL Community Server - GPLCopyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> create user 'test-1'@'%' identified by '123456';
Query OK, 0 rows affected (0.11 sec)mysql> grant all on MineGi.* to 'test-1'@'%';
Query OK, 0 rows affected (0.03 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)mysql> exit
Bye
[root@MineGi ~]# docker stop my_mysql
my_mysql
[root@MineGi ~]# docker rm my_mysql
my_mysql
[root@MineGi ~]#

3、创建新容器并使用之前的数据

命令示例:

mkdir -p /data/mysql/data
cp -a /var/lib/docker/volumes/mysql_data/_data/* /data/mysql/data
docker run --name my_mysql -v /data/mysql/data:/var/lib/mysql -d mysql:v8
docker exec -it my_mysql mysql -utest-1 -p123456
show databases;
show tables in MineGi;

输出结果:

[root@MineGi ~]# mkdir -p /data/mysql/data
[root@MineGi ~]# cp -a /var/lib/docker/volumes/mysql_data/_data/* /data/mysql/data
[root@MineGi ~]# docker run --name my_mysql -v /data/mysql/data:/var/lib/mysql -d mysql:v8
e5b8cec1fda1bd811c3e2828369b5380b623f02e4c1b9d8cde47ca87aaa3d82e
[root@MineGi ~]# docker exec -it my_mysql mysql -utest-1 -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.11 MySQL Community Server - GPLCopyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| MineGi             |
| information_schema |
+--------------------+
2 rows in set (0.01 sec)mysql> show tables in MineGi;
+------------------+
| Tables_in_MineGi |
+------------------+
| test11           |
+------------------+
1 row in set (0.01 sec)mysql>

 情况说明:对于数据库的数据目录。可以直接使用Bind Mount方式挂载

关于这方面的解释如下:

  • 理解数据持久化的概念
    • 当你将 Docker 容器中的数据库目录持久化到宿主机时,实际上是将容器内的数据存储位置映射到了宿主机的文件系统中。
    • 例如,对于 MySQL 容器,其内部存储数据的目录(如/var/lib/mysql)通过-v(volume)参数挂载到宿主机的某个目录。
  • 容器启动时的数据加载
    • 如果在容器启动之前,挂载的宿主机目录中已经存在有效的数据库文件,容器内的数据库服务在启动时会加载这些文件。
    • 以 MySQL 为例,当容器中的 MySQL 服务启动时,它会检查数据目录(现在已经挂载到宿主机)中的文件。如果存在数据库文件(如.frm、.ibd等 MySQL 数据文件格式),它会读取这些文件来恢复数据库的状态,包括数据库、表结构和数据等内容。
  • 数据共享和同步机制
    • 这种持久化方式使得容器和宿主机之间的数据共享成为可能。在容器运行期间,对数据库的任何写入操作(如插入、更新数据),实际上是在宿主机挂载的目录中对应的文件上进行写入。
    • 这是因为容器内的数据库进程认为数据目录就是它正常存储数据的地方,而这个目录已经被挂载到宿主机,所以数据会持久地保存在宿主机上,并且在容器重新启动等情况下可以被再次加载和使用。
  • 容器镜像初始内容的复制
    • 当你使用docker run命令并挂载了一个宿主机上不存在的目录(如/data/test01)到容器内的/var/lib/mysql(MySQL 数据存储目录)时,Docker 会自动将容器内部/var/lib/mysql目录中的初始内容复制到宿主机挂载点。
    • 对于mysql:v8这个镜像,其内部/var/lib/mysql目录已经包含了 MySQL 初始化所需要的一些系统文件,如配置文件(auto.cnf)、证书文件(ca.pem、client - cert.pem等)以及数据库初始文件(ibdata1、ib_logfile0等)。这些文件在容器启动并挂载卷时被复制到了宿主机的/data/test01目录。
  • 数据库文件系统的初始化机制
    • MySQL 等数据库在启动时会检查数据目录是否为空。如果数据目录不存在某些关键文件,它会尝试初始化这些文件。
    • 由于容器镜像中已经有了这些初始化文件,当通过挂载卷的方式将容器内的数据目录和宿主机目录关联起来时,这些初始化文件就被复制到了宿主机,使得在宿主机挂载点看起来有了内容。这些文件是数据库正常运行所必需的,后续数据库的操作(如创建表、插入数据等)也会将数据存储在这个挂载的目录中,保证数据的持久化。

相关文章:

使用Docker启用MySQL8.0.11

目录 一、Docker减小镜像大小的方式 1、基础镜像选择 2、减少镜像层数 3、清理无用文件和缓存 4、优化文件复制&#xff08;COPY和ADD指令&#xff09; 二、Docker镜像多阶段构建 1、什么是dockers镜像多阶段构建 1.1 概念介绍 1.2 构建过程和优势 2、怎样在Dockerfil…...

部署Mysql、镜像和容器、常见命令

目录 部署Mysql 镜像和容器 常见命令 部署Mysql 可以有多个容器 docker run -d \--name mysql \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \mysql docker run -d \--name mysql2 \-p 3307:3307 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \mys…...

Windows部署Docker及PostgreSQL数据库相关操作

一、Windows安装Docker 1.wsl安装 以管理员身份启动命令行&#xff0c;运行&#xff1a;wsl --install&#xff1b; 安装结束后&#xff0c;重启电脑&#xff0c;以管理员身份启动命令行&#xff0c;运行&#xff1a;wsl --install -d Ubuntu&#xff1b; 中间需要输入用户名…...

Halcon例程代码解读:安全环检测(附源码|图像下载链接)

安全环检测核心思路与代码详解 项目目标 本项目的目标是检测图像中的安全环位置和方向。通过形状匹配技术&#xff0c;从一张模型图像中提取安全环的特征&#xff0c;并在后续图像中识别多个实例&#xff0c;完成检测和方向标定。 实现思路 安全环检测分为以下核心步骤&…...

Unity3D用正则判断身份证号或邮箱

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、正则判断邮箱格式👉二、正则判断身份证号👉壁纸分享👉总结👉前言 C#正则表达式(Regex)是一种用来匹配字符串模式的强大工具。在C#中,可以使用System.Text.RegularExpressions命名空间下的Regex类来处…...

PostgreSQL表达式的类型

PostgreSQL表达式是数据库查询中非常重要的组成部分&#xff0c;它们由一个或多个值、运算符和PostgreSQL函数组合而成&#xff0c;用于计算出一个单一的结果。这些表达式类似于公式&#xff0c;可以用查询语言编写&#xff0c;并用于查询数据库中的特定数据集。 PostgreSQL表…...

C++简明教程(文章要求学过一点C语言)(10)

类的教程 C 类的完整教程 C 中&#xff0c;类&#xff08;class&#xff09;是面向对象编程的核心概念&#xff0c;用于定义对象的属性&#xff08;数据成员&#xff09;和行为&#xff08;成员函数&#xff09;。本教程将带你从零开始&#xff0c;循序渐进地学习如何定义和使…...

从腾讯云的恶意文件查杀学习下PHP的eval函数

问题来自于腾讯云的主机安全通知&#xff1a; &#x1f680;一键接入&#xff0c;畅享GPT及AI大模型服务&#xff01;【顶级API中转品牌】&#xff1a; https://api.ablai.top/ 病毒文件副本内容如下&#xff1a; <?php function x($x){eval($x);}x(str_rot13(riny($_CBF…...

OpenWRT——官方镜像安装Docker(网络环境需设置)并配置Sun-Panel

Pro更多功能预览地址https://pro.sun-panel.top/#/hpage/pro Github地址https://github.com/hslr-s/sun-panel?tabreadme-ov-file 首先确认宿主机网络环境符合要求 curl Google.com1.确认没问题后开始安装Docker opkg update opkg install dockerd docker luci-app-docker…...

MySQL 中的常见错误与排查

在 MySQL 数据库的日常运维中&#xff0c;管理员可能会遇到各种错误。无论是查询性能问题、连接异常、数据一致性问题&#xff0c;还是磁盘空间不足等&#xff0c;及时排查并解决这些问题是保证数据库稳定运行的关键。本文将列出 MySQL 中一些常见的错误及其排查方法。 一、连接…...

workman服务端开发模式-应用开发-gateway长链接端工作原理

一、长链接的工作原理 Register类其实也是基于基础的Worker开发的。Gateway进程和BusinessWorker进程启动后分别向Register进程注册自己的通讯地址&#xff0c;Gateway进程和BusinessWorker通过Register进程得到通讯地址后&#xff0c;就可以建立起连接并通讯了。而Gateway进程…...

8位移位寄存器的verilog语言

module shift_register (output reg [7:0] Q, // 8位移位寄存器输出input D, // 输入数据input rst, // 复位信号input clk // 时钟信号 );always (posedge clk) beginif (!rst)Q < 8b00000000; // 复位时将Q清零elseQ < {Q[6:0], D}; // 否则…...

Android学习(五)-Kotlin编程语言-面向对象中的 继承-构造函数-接口三模块学习

首先&#xff0c;我们需要定义一个 Person 类&#xff1a; open class Person {var name ""var age 0fun eat() {println("$name is eating.")} } 注意&#xff0c;Person 类前面加上了 open 关键字&#xff0c;表示这个类可以被继承。在 Kotlin 中&am…...

Java 集合框架中的 List、ArrayList 和 泛型 实例

— Java 集合框架中的 List、ArrayList 和 泛型 在 Java 中&#xff0c;集合框架提供了许多不同类型的集合类&#xff0c;用于存储和操作对象。List 和 ArrayList 是最常用的两种集合类型&#xff0c;而泛型&#xff08;Generics&#xff09;则是 Java 中的一项重要特性&…...

计算机网络-L2TP VPN基础概念与原理

一、概述 前面学习了GRE和IPSec VPN&#xff0c;今天继续学习另外一个也很常见的VPN类型-L2TP VPN。 L2TP&#xff08;Layer 2 Tunneling Protocol&#xff09; 协议结合了L2F协议和PPTP协议的优点&#xff0c;是IETF有关二层隧道协议的工业标准。L2TP是虚拟私有拨号网VPDN&…...

【Rust自学】4.4. 引用与借用

4.4.0 写在正文之前 这一节的内容其实就相当于C的智能指针移动语义在编译器层面做了一些约束。Rust中引用的写法通过编译器的约束写成了C中最理想、最规范的指针写法。所以学过C的人对这一章肯定会非常熟悉。 喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文…...

LLaMA-Factory 单卡3080*2 deepspeed zero3 微调Qwen2.5-7B-Instruct

环境安装 git clone https://gitcode.com/gh_mirrors/ll/LLaMA-Factory.gitcd LLaMA-Factorypip install -e ".[torch,metrics]"pip install deepspeed 下载模型 pip install modelscope modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir /roo…...

[python SQLAlchemy数据库操作入门]-12.直接执行 SQL 语句处理股票数据

哈喽,大家好,我是木头左! 1. SQLAlchemy Core 简介 SQLAlchemy Core 是 SQLAlchemy 库的一个模块,它允许用户直接执行 SQL 语句而不必使用 ORM(对象关系映射)。对于需要精细控制 SQL 查询或处理复杂数据库操作的情况,SQLAlchemy Core 提供了一种灵活而强大的方式来与数…...

【Unity3D】实现可视化链式结构数据(节点数据)

关键词&#xff1a;UnityEditor、可视化节点编辑、Unity编辑器自定义窗口工具 使用Newtonsoft.Json、UnityEditor相关接口实现 主要代码&#xff1a; Handles.DrawBezier(起点&#xff0c;终点&#xff0c;起点切线向量&#xff0c;终点切线向量&#xff0c;颜色&#xff0c;n…...

C# WinForm移除非法字符的输入框

C# WinForm移除非法字符的输入框 文章目录 namespace System.Windows.Forms {using System.ComponentModel;/// <summary>/// 支持移除 非法字符 的输入框。/// </summary>public class RemoveInvalidCharTextBox : TextBox{/// <summary>/// 测试代码&#…...

linux安装宝塔面板及git

宝塔面板安装教程&#xff1a;https://www.bt.cn/new/download.html?bt_lybaidu&sdclkidALfs15q615oG15As&bd_vid9358688624393223862 Centos/OpenCloud/Alibaba稳定版9.0.0 urlhttps://download.bt.cn/install/install_lts.sh;if [ -f /usr/bin/curl ];then curl -s…...

GoTime#34期 Pachyderm, Provenance, Data Lakes

本篇内容是根据2017年2月份#34 Pachyderm, Provenance, Data Lakes音频录制内容的整理与翻译 Joe Doliner 加入了节目&#xff0c;谈论使用 Pachyderm 管理数据湖、数据容器、溯源(provenance) 以及其他有趣的 Go 项目和新闻。 Erik St. Martin: 大家好&#xff0c;欢迎收听新…...

数据库的三范式是什么?

第一范式&#xff08;1NF&#xff09; 每列的原子性&#xff0c;表中的每一个字段都是不可分割的&#xff0c;同一列中不能有多个值。第一范式是对关系模式的基本要求&#xff0c;不满足第一范式的数据库不是关系型数据库。 ・不满足第一范式的示例&#xff1a; 学生编号 学生…...

LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度

本代码的主要功能是建模 LOS&#xff08;视距&#xff09;和 NLOS&#xff08;非视距&#xff09;环境下的定位系统&#xff0c;估计目标的动态位置&#xff0c;三维空间 文章目录 运行结果源代码代码介绍 总结 运行结果 10个点的轨迹定位&#xff1a; 50个点的轨迹定位&#…...

css

已经学完html了&#xff0c;继续学习前端三剑客html、css、js之一的css。&#x1f600; 1、什么是css css&#xff1a;用于网页结构的布局和修饰的一种样式脚本 层叠样式表&#xff1a;(英文全称&#xff1a;Cascading Style Sheets)&#xff0c; 简称&#xff1a;样式表&…...

探索 Bokeh:轻松创建交互式数据可视化的强大工具

探索 Bokeh&#xff1a;轻松创建交互式数据可视化的强大工具 在数据科学和数据分析领域&#xff0c;交互式数据可视化是一项不可或缺的技能。Bokeh 是一个强大的 Python 库&#xff0c;它可以帮助我们快速构建高质量的交互式图表和仪表盘&#xff0c;同时兼具高性能和灵活性。…...

光谱相机在农业的应用

一、作物生长监测1、营养状况评估 原理&#xff1a;不同的营养元素在植物体内的含量变化会导致植物叶片或其他组织的光谱反射率特性发生改变。例如&#xff0c;氮元素是植物叶绿素的重要组成部分&#xff0c;植物缺氮时&#xff0c;叶绿素含量下降&#xff0c;其在可见光波段&a…...

SYD881X RTC定时器事件在调用timeAppClockSet后会出现比较大的延迟

RTC定时器事件在调用timeAppClockSet后会出现比较大的延迟 这里RTC做了两个定时器一个是12秒,一个是185秒: #define RTCEVT_NUM ((uint8_t) 0x02)//当前定时器事件数#define RTCEVT_12S ((uint32_t) 0x0000002)//定时器1s事件 /*整分钟定时器事件&#xff0c;因为其余的…...

【Java基础面试题026】Java中的String、StringBuffer和StringBuilder的区别是什么?

回答重点 他们都是Java中处理字符串的类&#xff0c;区别主要体现在可变性、线程安全和性能上 1&#xff09;String 不可变&#xff1a;String是不可变类&#xff0c;字符串对象创建&#xff0c;存储在堆中&#xff0c;字符串内容存储在字符串常量池中&#xff0c;一旦创建内…...

Ajax中的axios

既然提到Ajax&#xff0c;那就先来说一说什么是Ajax吧 关于Ajax Ajax的定义 Asynchronous JavaScript And XML&#xff1a;异步的JavaScript和XML。 反正就是一句话总结&#xff1a; 使用XML HttpRequest 对象与服务器进行通讯。 AJAX 是一种在无需重新加载整个网页的情况下&…...

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证3)

根据参考文献1中JWT Token的组成及计算方式&#xff0c;对照参考文献2中的界面&#xff0c;实现简单的JWT Token解析及验证程序&#xff0c;主要功能包括&#xff1a;   1&#xff09;拆分Token字符串&#xff0c;将前两段使用Base64UrlEncoder类解码并转为UTF8字符串&#x…...

jmeter后端监视器

一、概述 JMeter 后端监听器(Backend Listener)是 JMeter 提供的一个功能强大的插件,用于将测试执行期间收集的性能数据发送到外部系统进行监控和分析。通过后端监听器,您可以实时地将 JMeter 测试执行期间收集的数据发送到外部系统,如图形化展示、数据库、数据分析工具等…...

vue CSS 自定义宽高 翻页 剥离 效果

新增需求&#xff0c;客户需要类似PPT的剥离效果用于WEB页面翻页&#xff0c;查找资料后&#xff0c;参考下方的掘金博主的文章&#xff0c;并将HTML修改成vue的页面进行使用。其中宽度、高度改成了变量&#xff0c;样式style中的属性与宽高的关系整理成了公式进行动态计算。 …...

函数:参数与返回值类型

本文我们将深入探讨 函数的参数和返回值类型&#xff0c;这是 TypeScript 中最常用的特性之一。了解如何为函数参数和返回值添加类型&#xff0c;不仅能帮助你避免常见的错误&#xff0c;还能提高代码的可读性和可维护性。 在 JavaScript 中&#xff0c;函数的参数和返回值是没…...

【学习总结|DAY022】Java网络编程

网络编程是Java开发中非常重要的一环&#xff0c;它允许程序与网络上的其他设备进行数据交互。本文将介绍Java网络编程的基础知识&#xff0c;包括网络编程三要素、UDP和TCP通信协议&#xff0c;以及BS架构的原理。 网络编程三要素 网络通信至少需要三个要素&#xff1a;IP地…...

帝国cms同一条信息使用不同的多个内容页模板伪静态实现教程

理论上可以实现一条信息使用无数个内容页模板&#xff0c;实现过程&#xff1a; 1、/e/action目录下新建bishun.php&#xff0c;内容如下&#xff1a; <?php require(../class/connect.php); require(../class/db_sql.php); require(../class/functions.php); require(..…...

解决Linux<云服务器>访问HuggingFace的问题(操作记录)

一、准备配置文件 cache.db clash config.yaml Country.mmdb&#xff08;1&#xff09;cache.db、clash的获取 链接&#xff1a;百度网盘 提取码&#xff1a;82t0 &#xff08;2&#xff09;config.yaml、Country.mmdb的获取 启动本地已安装的clash软件→找到“配置订阅”…...

selenium 报错 invalid argument: invalid locator

环境&#xff1a; Python3.12.2 selenium4.0 报错信息&#xff1a; invalid argument: invalid locator 错误分析&#xff1a; selenium语法错误,find_element方法少写By.XPATH参数 错误语法如下&#xff1a; driver.find_element(//div[id"myid"]) 解决办…...

springboot——登录认证(包括jwt技术、拦截器过滤器)

实现登录的原理 用户名和密码都输入正确,登录成功,否则,登录失败 登录功能的本质:查询,根据用户名和密码查询员工信息 实现登录的步骤 登录需要确定用户的id、username、name、token(用于 身份校验),对此要重新定义一个类LoginInfo public class LoginInfo {priva…...

【IN、NOT、AND、OR】在 MySql 中的使用方法,使用场景、注意事项

目录 IN NOT AND OR 注意事项&#xff1a; 使用场景&#xff1a; IN 用于指定某个字段的值在一个预定义的列表中。 SELECT * FROM users WHERE age IN (20, 25, 30);查询返回 age 字段 是20、25 、30 的用户记录。 NOT 用于对条件进行否定。 查询将返回与指定 条件相…...

html <a>设置发送邮件链接、打电话链接 <a href=“mailto:></a> <a href=“tel:></a>

1.代码 <ul><li>电话&#xff1a;<a href"tel:18888888888">188-8888-8888</a></li><li>邮箱&#xff1a;<a href"mailto:10000qq.com">10000qq.com</a></li><li>邮箱&#xff1a;<a hre…...

Mac上详细配置java开发环境和软件(更新中)

文章目录 概要JDK的配置JDK下载安装配置JDK环境变量文件 Idea的安装Mysql安装和配置Navicat Premium16.1安装安装Vscode安装和配置Maven配置本地仓库配置阿里云私服Idea集成Maven Cpolar快速入门 概要 这里使用的是M3型片 14.6版本的Mac 用到的资源放在网盘 链接: https://pan…...

游戏渠道假量解决方案

某推广公司在推广过程中被查出“短期内点击量激增”“存在同一地址多次访问”“已注册用户重复注册”等数据作弊行为&#xff0c;法院判罚退还服务费200余万元&#xff0c;并赔偿违约金约350万元。 某公司为提升其游戏在应用商店榜单排名&#xff0c;委托某网络公司进行下载、注…...

Java重要面试名词整理(二):SpringMyBatis

文章目录 Spring篇Spring核心推断构造方法AOP动态代理Advice的分类Advisor的理解AOP相关的概念 定义BeanASM技术JFR依赖注入循环依赖LifecycleSpring AOT Spring事务Spring事务传播机制Spring事务传播机制是如何实现的呢?Spring事务传播机制分类 SpringMVCHandlerHandlerMappi…...

powershell美化

powershell美化 写在前面 除了安装命令&#xff0c;其他都是测试命令&#xff0c;后续再写进配置文件 安装主题控件 安装主题oh-my-posh&#xff0c;powershell中执行 winget install JanDeDobbeleer.OhMyPosh -s winget oh-my-posh init pwsh | Invoke-Expression # 查看…...

D102【python 接口自动化学习】- pytest进阶之fixture用法

day102 pytest的usefixtures方法 学习日期&#xff1a;20241219 学习目标&#xff1a;pytest基础用法 -- pytest的usefixtures方法 学习笔记&#xff1a; fixture调用方法 实际应用 总结 pytest.mark.usefixtures(func)&#xff0c;pytest的usefixtures方法&#xff0c;无…...

Excel生成DBC脚本源文件

Excel制作 新建一个Excel&#xff0c;后缀为“.xls” 工作本名称改为“CAN_Matrix” 在首行按照列来起名字&#xff0c;在里面只需要填写必须的内容即可。 列数名称第0列Message Name第1列Message Format第2列Message ID第3列Message Length (byte)第4列Message Transmitte…...

【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序

问题背景 班里有 m m m 位学生&#xff0c;共计划组织 n n n 场考试。给你一个下标从 0 0 0 开始、大小为 m n m \times n mn 的整数矩阵 s c o r e score score&#xff0c;其中每一行对应一位学生&#xff0c;而 s c o r e [ i ] [ j ] score[i][j] score[i][j] 表示…...

Spring MVC(上)

上一篇博客的补充: 一般出现这种问题,我们就要检查版本了 我们需要查看这几个地方是否版本是对的 注意: jdk版本运行取决于什么? 1.通过cmd运行,jdk版本就是你设置的环境变量 2.通过Idea运行,取决于该项目设置的JDK版本 创建项目的方式: 1> 我们上个博客用idea进行创建 2…...

【优选算法---归并排序衍生题目】剑指offer51---数组中的逆序对、计算右侧小于当前元素的个数、翻转对

一、剑指offer51---数组中的逆序对 题目链接: LCR 170. 交易逆序对的总数 - 力扣&#xff08;LeetCode&#xff09; 题目介绍&#xff1a; 在数组中的两个数字&#xff0c;如果前面⼀个数字大于后面的数字&#xff0c;则这两个数字组成⼀个逆序对。输入一个数组&#xff0c…...