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

docker 指定根目录 迁移根目录

docker 指定根目录 迁移根目录

  • 1、问题描述
  • 2、问题分析
  • 3、解决方法
    • 3.1、启动docker程序前就手动指定docker根目录为一个大的分区(支持动态扩容),事前就根本上解决根目录空间不够问题
      • 3.1.0、方法思路
      • 3.1.1、docker官网安装文档
      • 3.1.2、下载docker安装包
      • 3.1.3、安装docker 26.1.0
      • 3.1.4、配置docker systemd服务
    • 3.2、发现docker根目录爆满了,改变docker根目录为一个大的分区(支持动态扩容),事后解决根目录空间不够问题(需要迁移之前的根目录数据到新的根目录)
      • 3.2.1、正常安装docker后 docker根目录是/var/lib/docker
        • 3.2.1.1、官网安装文档
        • 3.2.1.2、下载docker安装包
        • 3.2.1.3、安装docker 26.1.0
        • 3.2.1.4、配置docker systemd服务
      • 3.2.2、默认根目录安装docker后,创建容器和容器数据一段时间后发现docker根目录空间不够、需要迁移根目录
        • 3.2.2.1、创建redis、mysql容器
        • 3.2.2.2、创建redis、mysql数据
      • 3.2.3、配置新的docker根目录、迁移docker根目录数据到新的根目录
      • 3.2.4、重要!!!迁移docker根目录后 确认docker服务正常
        • 3.2.4.1、检查容器启动是否正常,docker logs 查看容器启动日志
        • 3.2.4.2、执行容器内部服务检测,确认容器服务的接口调用是否正常
        • 3.2.4.3、执行df -lh 查看输出确认docker根目录是否已迁移到新路径

1、问题描述

默认启动docker后,默认的docker根目录是/var/lib/docker
使用docker info 命令查看docker根目录

docker info

在这里插入图片描述

在有些服务器上,/ 根目录空间非常小而且不能动态扩容,不能承载太多的docker镜像和数据,随着docker的运行,默认的docker根目录是/var/lib/docker 占用空间越来越大,导致/ 目录爆满,系统崩溃。(为什么不扩充根目录呢?因为在有些服务器上根目录不是LVM分区、不能动态扩容)

不指定配置文件,默认启动docker服务后,docker根目录如下,查看docker根目录的组织结构

ls -l /var/lib/docker

整个根目录大小是340K

在这里插入图片描述

根目录下各个子目录大小如下

在这里插入图片描述

docker 根目录结构如下 这些?所在的地方都是空格

[root@centos ~]# tree /var/lib/docker/
/var/lib/docker/
├── buildkit
│?? ├── cache.db
│?? ├── containerdmeta.db
│?? ├── content
│?? │?? └── ingest
│?? ├── executor
│?? ├── history.db
│?? ├── metadata_v2.db
│?? └── snapshots.db
├── containerd
│?? └── daemon
│??     ├── io.containerd.content.v1.content
│??     │?? └── ingest
│??     ├── io.containerd.metadata.v1.bolt
│??     │?? └── meta.db
│??     ├── io.containerd.runtime.v1.linux
│??     ├── io.containerd.runtime.v2.task
│??     ├── io.containerd.snapshotter.v1.blockfile
│??     ├── io.containerd.snapshotter.v1.native
│??     │?? └── snapshots
│??     ├── io.containerd.snapshotter.v1.overlayfs
│??     │?? └── snapshots
│??     └── tmpmounts
├── containers
├── engine-id
├── image
│?? └── overlay2
│??     ├── distribution
│??     ├── imagedb
│??     │?? ├── content
│??     │?? │?? └── sha256
│??     │?? └── metadata
│??     │??     └── sha256
│??     ├── layerdb
│??     └── repositories.json
├── network
│?? └── files
│??     └── local-kv.db
├── overlay2
│?? └── l
├── plugins
│?? ├── storage
│?? │?? └── ingest
│?? └── tmp
├── runtimes
├── swarm
├── tmp
└── volumes├── backingFsBlockDev└── metadata.db39 directories, 11 files
[root@centos ~]#

2、问题分析

有2个思路解决docker根目录空间爆满的问题
1、整体规划,防患于未然
在docker程序启动前,通过docke daemon的配置文件指定一个很大或者可以动态扩容的文件目录作为docker根目录。
2、后知后觉,整体规划没做好,事后处理
如果在生产环境上,运行docker程序签没有手动指定docker根目录,造成默认的docker根目录就是/var/lib/docker,并且环境已经运行一段时间发现根目录空间不够了,这种情况下仍然可以通过docke daemon的配置文件指定一个很大或者可以动态扩容的文件目录作为docker根目录,只不过要把之前docker根目录/var/lib/docker下哦数据迁移到新的docker根目录即可。。

3、解决方法

3.1、启动docker程序前就手动指定docker根目录为一个大的分区(支持动态扩容),事前就根本上解决根目录空间不够问题

3.1.0、方法思路

在docker启动前,先在配置文件中指定docker根目录,这个根目录的空间要保证非常大,或者这个根目录是能够动态扩容的,比如LVM分区。

linux上docker daemon配置文件是/etc/docker/daemon.json
windwos上docker daemon配置文件是C:\ProgramData\docker\config\daemon.json

本文以linux系统为例描述配置docker根目录方法
参考链接: https://docs.docker.com/config/daemon/

在linux系统上安装完成docker后,先不要启动docker程序。

先编辑docker配置文件/etc/docker/daemon.json

mkdir /etc/docker
vi /etc/docker/daemon.json

注:默认情况下这个docker配置文件是没有的,这里实际也就是新建一个/etc/docker/daemon.json

写入以下内容 其中/path/to/docker是自定义的docker根目录,需要保证/path/to/这个目录存在

{"data-root": "/path/to/docker"
}

然后启动docker服务

systemctl start docker.service

安装过程如下

3.1.1、docker官网安装文档

https://docs.docker.com/engine/install/binaries/

3.1.2、下载docker安装包

官方下载链接:https://download.docker.com/linux/static/stable/
选择最新版 26.1.0 下载

在这里插入图片描述

文件名:docker-26.1.0.tgz

3.1.3、安装docker 26.1.0

上传docker-26.1.0.tgz到linux服务器

cd /path/to/docker-26.1.0.tgz
tar -xzvf docker-26.1.0.tgz
cp docker/* /usr/bin/

至此安装完成docker

查看docker版本

docker --version

在这里插入图片描述

3.1.4、配置docker systemd服务

vi /etc/systemd/system/docker.service

插入以下内容

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target

为docker.service添加可执行权限

chmod +x  /etc/systemd/system/docker.service

重新加载docker.service配置文件,使得systemctl识别docker.service

systemctl daemon-reload

配置docker.service开机自启动

systemctl enable docker.service

查看操作系统文件系统目录

df -lTh

在这里插入图片描述

编辑docker配置文件/etc/docker/daemon.json

mkdir /etc/docker
vi /etc/docker/daemon.json

注:默认情况下这个docker配置文件是没有的,这里实际也就是新建一个/etc/docker/daemon.json

写入以下内容 其中/home/docker是自定义的docker根目录

{"data-root": "/home/docker"
}

启动docker服务前执行docker info 查看docker根目录 报错:docker服务未在运行

docker info

在这里插入图片描述

启动docker服务前查看docker根目录结构,还没有创建docker根目录
在这里插入图片描述

然后启动docker服务

systemctl start docker.service

启动docker服务时,会自动创建docker根目录/home/docker
在这里插入图片描述

查看docker服务

systemctl status docker.service

在这里插入图片描述

查看docker信息

docker info

在这里插入图片描述

在这里插入图片描述

得知docke的根目录是 /home/docker

在这里插入图片描述

查看docker根目录的组织结构

ls -l /home/docker

整个根目录大小是340K、根目录下各个子目录大小如下

在这里插入图片描述

导入镜像前查看 /home/docker/overlay2

ls -l /home/docker/overlay2

在这里插入图片描述

导入redis镜像文件

在这里插入图片描述

导入mysql像文件

在这里插入图片描述

在这里插入图片描述

查看操作系统文件系统目录

df -lTh

在这里插入图片描述
启动docker前的操作系统文件系统目录如下

df -lTh

在这里插入图片描述

发现导入2个镜像后 docker根目录所在的/homr分区 就增大了差不多1G。后期docker会导入更多的镜像、docker系统日志会占用很多空间,因此在启动docker服务前先编辑配置文件选择一恶搞大的分区作为docker根目录是很重要的。

3.2、发现docker根目录爆满了,改变docker根目录为一个大的分区(支持动态扩容),事后解决根目录空间不够问题(需要迁移之前的根目录数据到新的根目录)

3.2.1、正常安装docker后 docker根目录是/var/lib/docker

3.2.1.1、官网安装文档

https://docs.docker.com/engine/install/binaries/

3.2.1.2、下载docker安装包

官方下载链接:https://download.docker.com/linux/static/stable/
选择最新版 26.1.0 下载

在这里插入图片描述

文件名:docker-26.1.0.tgz

3.2.1.3、安装docker 26.1.0

上传docker-26.1.0.tgz到linux服务器

cd /path/to/docker-26.1.0.tgz
tar -xzvf docker-26.1.0.tgz
cp docker/* /usr/bin/

至此安装完成docker

查看docker版本

docker --version

在这里插入图片描述

3.2.1.4、配置docker systemd服务
vi /etc/systemd/system/docker.service

插入以下内容

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target

为docker.service添加可执行权限

chmod +x  /etc/systemd/system/docker.service

重新加载docker.service配置文件,使得systemctl识别docker.service

systemctl daemon-reload

配置docker.service开机自启动

systemctl enable docker.service

启动docker服务

systemctl start docker.service

查看docker服务

systemctl status docker.service

在这里插入图片描述

查看docker信息

docker info

在这里插入图片描述

在这里插入图片描述

得知docker默认的根目录是 /var/lib/docker

在这里插入图片描述

查看docker根目录的组织结构

ls -l /var/lib/docker

整个根目录大小是340K

在这里插入图片描述

根目录下各个子目录大小如下

在这里插入图片描述

3.2.2、默认根目录安装docker后,创建容器和容器数据一段时间后发现docker根目录空间不够、需要迁移根目录

3.2.2.1、创建redis、mysql容器

上传redis镜像包redis7.2.4.tar、mysql镜像包mysql8.4.0.tar到服务器
导入镜像包前查看dock镜像、docker容器都是空的

在这里插入图片描述

导入redis、mysql镜像

cd /path/to/redis7.2.4.tar
docker load -i redis7.2.4.tar
cd /path/to/mysql8.4.0.tar
docker load -i mysql8.4.0.tar

在这里插入图片描述

创建redis、mysql容器

docker run --name redis7.2.4 --user=root --net=host --privileged --cap-add=ALL -idt --log-opt max-size=64m --log-opt max-file=3 --restart=always redis:7.2.4
docker run --name mysql8.4.0 --user=root --net=host --privileged --cap-add=ALL -idt -e MYSQL_ROOT_PASSWORD=root --log-opt max-size=64m --log-opt max-file=3 --restart=always mysql:8.4.0

查看redis、mysql容器

docker ps -a

在这里插入图片描述
查看docker根目录的组织结构

ls -l /var/lib/docker

整个根目录大小是1.7G,根目录下各个子目录大小如下。仅仅是导入了redis、mysql镜像、创建了redis、mysql容器,仅仅2个容器根目录从最初docker安装后的340K增大到了1.7G,这仅仅是刚刚导入镜像和创建容器后的根目录占用量1.7G。

在这里插入图片描述

查看操作系统分区占用情况

df -lTh

在这里插入图片描述

等mysql运行一段时间后,假设是业务环境、数据表数据量非常多、很快mysql的空间占用率会急剧增大,这个占用量就在docker根目录里。因为mysql的数据量占用空间属于mysql容器、mysql容器占用空间属于docker根目录,最终导致docker根目录也就是/var/lib/docker占用量急剧增大,最终导致操作系统上docker根目录所在的分区爆满,如果操作系统docker根目录所在的分区不能动态扩容,操作系统很快就会因为docker根目录所在的分区爆满而崩溃。

这种情况下就需要考虑迁移docker根目录数据到新的docker根目录,并且修改docker配置文件指定新的docker根目录。

3.2.2.2、创建redis、mysql数据

下面创建mysql数据表,为了快速创建,直接从其他数据库中备份的sql文件恢复到mysql容器中。
创建mysql数据表前查看mysql容器中mysql根目录占用空间 占用了213M,mysql容器内部查看操作系统分区信息,发现mysql容器的根目录就是docker服务的根目录所在宿主机的分区,因此docker服务根目录一定要大,或者能够动态扩容才行,不然很快就会因为容器的占用空间增大导致docker服务根目录增大,最终导致docker服务的根目录所在宿主机的分区爆满、最终操作系统崩溃。

查看mysql容器内部的mysql配置文件/etc/my.cnf发现mysql根目录是/var/lib/mysql

cat /etc/my.cnf|grep -i dir

在这里插入图片描述

这次新安装的mysql容器数据库如下

在这里插入图片描述

直接从其他数据库中备份的sql文件恢复到mysql容器中

在这里插入图片描述

恢复mysql数据完成

在这里插入图片描述

再次查看mysql容器数据库如下

show databases;
use kgc;
select table_name,table_comment,create_time from information_schema.TABLES where table_schema='kgc';
select * from banji;

在这里插入图片描述

恢复mysql数据完成后再次查看mysql容器中mysql根目录占用空间 占用从213M增加到了352M。这是因为恢复的数据库表占用了空间。

在这里插入图片描述

mysql容器操作系统根目录占用空间从2.4G增大到了2.6G。

在这里插入图片描述

在这里插入图片描述

mysql容器数据量占用的增大,最终体现在宿主机上就是docker根目录的增大,从1.7G增大到了1.9G。

在这里插入图片描述

在这里插入图片描述

很快随着mysql容器的占用空间增大,最终会在宿主机上就是docker根目录的增大,最终导致宿主机上docker根目录所在的分区磁盘占用爆满,操作系统崩溃。怎么解决这个问题呢?只需迁移docker根目录到一个比较大的分区即可或者迁移docker根目录到一个可以动态扩展的分区,通常二者都要,把docker根目录迁移到一个空间比较大的而且可以动态扩容的分区即可。

在本博文3.2.3节中如果发现停止docker服务后和开启docker服务后,docker根目录占用空间不同,这是正常的,因为开启docker服务会拉起容器,啦气的容器占用了空间所致。
在这里插入图片描述

3.2.3、配置新的docker根目录、迁移docker根目录数据到新的根目录

停止docker服务

systemctl stop docker.service

建立新的docker根目录,执行命令df -h,找一个大的磁盘。这里指定的docker新的根目录是/home/docker

mkdir -p /home/docker

在这里插入图片描述

迁移/var/lib/docker目录下面的文件到 新的docker根目录/home/docker/home/docker

rm -rf /home/docker
cp -r /var/lib/docker   /home/docker

在这里插入图片描述

编辑docker配置文件/etc/docker/daemon.json 指定docker根目录是/home/docker

mkdir /etc/docker
vi /etc/docker/daemon.json

注:默认情况下这个docker配置文件是没有的,这里实际也就是新建一个/etc/docker/daemon.json

写入以下内容 其中/mnt/docker是自定义的docker根目录

{"data-root": "/home/docker"
}

然后启动docker服务

systemctl start docker.service

检查dockerx新的根目录是否配置成功

docker info | grep 'Docker Root Dir'

在这里插入图片描述

启动docker服务成功后,确认之前的镜像和容器还在不

docker images
docker ps -a

镜像容器都在,说明本次迁移根目录是成功的。mysql容器没有启动成功需要接下来接续排查。

在这里插入图片描述

3.2.4、重要!!!迁移docker根目录后 确认docker服务正常

3.2.4.1、检查容器启动是否正常,docker logs 查看容器启动日志
docker logs -f mysql8.4.0 --tail 200

在这里插入图片描述

日志显示是因为没有权限在/tmp下创建新的文件

在这里插入图片描述

查看/tmp 权限有写额权限

在这里插入图片描述

想到可能是mysql容器挂载目录的权限问题,查看mysql容器挂载目录

docker inspect mysql8.4.0|grep Mounts -C20

在这里插入图片描述

看宿主机上挂载目录的权限是不是1777,果然不是1777

在这里插入图片描述

查看原docker根目录下这个目录的权限是777

因此修改新docker根目录小这个目录的权限为777

systemctl stop docker.service
chmod -R 1777 /home/docker/volumes/e6265e69cc98fd7098523608fad604830884c4299dcbd6d1ea1aaaa29c6f7469/_data
systemctl start docker.service

在这里插入图片描述

然后Mysql容器后仍然报同样的错误

可能是docker根目录下其他的哪个目录权限不对 因此直接更改整个docker根目录权限是777 然后重启docker服务

systemctl stop docker.service
chmod -R 777 /home/docker/
systemctl start docker.service

查看所有容器都是正常启动的状态了

在这里插入图片描述

3.2.4.2、执行容器内部服务检测,确认容器服务的接口调用是否正常

进入mysql容器 查看数据库表和迁移docker根目录之前是否一致
登录mysql报错:mysql: [Warning] World-writable config file ‘/etc/my.cnf’ is ignored.

在这里插入图片描述

参考链接: https://www.cnblogs.com/hf8051/p/4991699.html

设置/etc/my,cnf的权限为644即可 即root用户可读写,其他用户不可写

在这里插入图片描述

再次登录mysql 报错:ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)

在这里插入图片描述

这个问题重启mysql容器即可

在这里插入图片描述

然后登录mysql报错:ERROR 1524 (HY000): Plugin ‘mysql_native_password’ is not loaded

在这里插入图片描述

这个问题需要修改/etc/my.cnf 在[mysqld]下面添加一行:skip-grant-tables(加上这句话之后重启mysql就可以免输密码登录了)

在这里插入图片描述

修改后如下

在这里插入图片描述

再次重启mysql容器 可以登录进mysql

在这里插入图片描述

查看mysql root用户的auth_plugin是mysql_native_password,这个mysql版本是8.4.0 已经启用了新的auth_plugin:caching_sha2_password,默认是caching_sha2_password。
因为上面恢复数据库数据用的是其他数据库的sql备份文件(这个数据库的auth_plugin是mysql_native_password、并且密码字段也被恢复成了这个数据库的密码 所以现在已经看不到原先的密码字段是什么内容了)导致的。现在只需要更改root用户的plugin为caching_sha2_passwor之后再重置root用户密码即可。

use mysql;
select user,plugin from user;

在这里插入图片描述

重置root用户的auth_plugin为caching_sha2_password

update user set plugin='caching_sha2_password' where user='root';

在这里插入图片描述

然后就是重置root用户的密码 操作步骤如下:
如果当前root用户authentication_string字段下有内容,先将其设置为空;

select user,authentication_string,plugin from user;

在这里插入图片描述

update user set authentication_string='' where user='root';
select user, authentication_string,plugin from user;

在这里插入图片描述

然后去掉/etc/my.cnf中的 skip-grant-tables这一行,重启mysql容器

使用root用户进行登录,因为上面设置了authentication_string为空,所以可以免密码登录;

mysql -u root -p
passwrod:直接回车;

在这里插入图片描述

然后使用ALTER修改root用户密码;

修改前root密码为空

在这里插入图片描述

修改root密码为root

ALTER USER 'root'@'%' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER;

在这里插入图片描述

修改root密码后如下

select user,authentication_string,plugin from user;

在这里插入图片描述

至此修改成功; 从新使用新的密码登录root用户即可;

在这里插入图片描述

再次登录mysql root用户输入正确密码root即可成功登录

在这里插入图片描述

输入错误密码不可登录

在这里插入图片描述

查询banji表的数据 和迁移docker根目录之前的数据是一样的。说明mysql容器内部服务没问题。

在这里插入图片描述

3.2.4.3、执行df -lh 查看输出确认docker根目录是否已迁移到新路径

迁移docker根目录后 宿主机操作系统执行df -lTh

df -lTh

在这里插入图片描述

迁移docker根目录后前 宿主机操作系统执行df -lTh

df -lTh

在这里插入图片描述

迁移docker根目录前后 ,宿主机操作系统执行df -lTh查看确实 docker根目录已经从/var/lib/docker变成了/home/docker

以上确认均没问题,至此,本次docker根目录迁移完成。

相关文章:

docker 指定根目录 迁移根目录

docker 指定根目录 迁移根目录 1、问题描述2、问题分析3、解决方法3.1、启动docker程序前就手动指定docker根目录为一个大的分区(支持动态扩容),事前就根本上解决根目录空间不够问题3.1.0、方法思路3.1.1、docker官网安装文档3.1.2、下载docker安装包3.1.3、安装doc…...

React 项目报错解决办法收录

React 使用 引入文件报错 (react 别名配置craco) react ,vue 初始项目都是不支持 别名引入文件的。 vue 一般项目初始化的时候会 在 vue.config.js 文件中配置好,所以不需要我们自己配置react 初始化的时候是没有配置的, 需要我们自己配置 …...

Linux专题-Makefile(1)

1.Makefile中的注释使用 # 2. Makefile中的静默执行。 makefile中,默认情况下执行一行命令前会先把这一行命令打印出来,然后再执行这条命令。如果不想看到打印的命令,则可以使用静默执 行的功能,即仅打印出命令执行的结果。使用方…...

机器学习算法应用——CART决策树

CART决策树(4-2) CART(Classification and Regression Trees)决策树是一种常用的机器学习算法,它既可以用于分类问题,也可以用于回归问题。CART决策树的主要原理是通过递归地将数据集划分为两个子集来构建决…...

Sqli-labs第五,六关

目录 首先找到他们的闭合方式 操作 总结: 第五关根据页面结果得知是字符型但是和前面四关还是不一样是因为页面虽然有东西。但是只有对于请求对错出现不一样页面其余的就没有了。这个时候我们用联合注入就没有用,因为联合注入是需要页面有回显位。如果…...

上海AI Lab开源首个可替代GPT-4V的多模态大模型

与开源和闭源模型相比,InternVL 1.5 在 OCR、多模态、数学和多轮对话等 18 个基准测试中的 8 个中取得了最先进的结果。 上海AI Lab 推出的 InternVL 1.5 是一款开源的多模态大语言模型 (MLLM),旨在弥合开源模型和专有商业模型在多模态理解方面的能力差距…...

Python教程:一文了解PageObject模式

PageObject 模式是一种用于测试自动化的设计模式,它将页面的功能和页面的实现分开,提高了代码的可维护性和可重用性。本文将从基础概念开始,逐步介绍 Python 中的 PageObject 模式,并提供详细的代码示例。 1. 什么是 PageObject 模…...

SpringBoot 启动时查询数据库数据,并赋值给全局变量

创建一个组件 AreaData import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component;import java.u…...

【Python】selenium爬虫常见用法和配置,以及常见错误和解决方法

欢迎来到《小5讲堂》 这是《Python》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言无执行文件代码报错信息错误路径手动下载自动下载 选项配置Ch…...

minio上传文件失败如何解决

1. 做了什么操作 通过接口上传excel文件,返回响应值 2. 错误如图 2. 如何解决 根据错误描述定位到了部署minio的地方minio通过docker部署,找到docker - compose发现配置文件中minio有两个端口,一个是用于api的,一个是用于管理界面…...

Java自动化测试框架--TestNG详解

一. 什么是TestNG TestNG是一个开源的自动化测试框架&#xff0c;它受JUnit和NUnit启发&#xff0c;其中“NG”即表示Next Generation&#xff0c;其功能更强大使用更方便。 二. TestNG配置 2.1 POM文件配置 在maven工程的pom.xml文件中加入以下依赖&#xff1a; <depe…...

【分布式 | 第五篇】何为分布式?分布式锁?和微服务关系?

文章目录 5.何为分布式&#xff1f;分布式锁&#xff1f;和微服务关系&#xff1f;5.1何为分布式&#xff1f;5.1.1定义5.1.2例子5.1.3优缺点&#xff08;1&#xff09;优点&#xff08;2&#xff09;缺点 5.2何为分布式锁&#xff1f;5.2.1定义5.2.2必要性 5.3区分分布式和微服…...

JavaScript百炼成仙自学笔记——13

函数七重关之六&#xff08;“new”一个函数&#xff09; 看个代码&#xff1a; function hello(){console.log(this); } 1、this&#xff1a;也是JavaScript中的一个关键字&#xff0c;永远指向当前函数的调用者 解释一下,有两层意思&#xff1a; ①this要嘛不出现&#…...

【skill】小米10让app永驻后台

小米10&#xff08;国行&#xff09;&#xff0c; 8128不能让app驻留后台我也忍了&#xff0c;但是12256依然如此&#xff0c;各种尝试&#xff0c;全网检索不杀app的方法&#xff0c;除了在系统设置里调&#xff0c;什么adb、shizuku冰箱冰柜的没一个能用 系统版本试过国行版…...

《架构风清扬-Java面试系列第29讲》聊聊DelayQueue的使用场景

DelayQueue是BlockingQueue接口的一个实现类之一 这个属于基础性问题&#xff0c;老规矩&#xff0c;我们将从使用场景和代码示例来进行讲解 来&#xff0c;思考片刻&#xff0c;给出你的答案 1&#xff0c;使用场景 实现&#xff1a;延迟队列&#xff0c;其中元素只有在其预定…...

说说SpringBoot自动配置原理

Spring Boot的自动配置原理可以概括为&#xff1a;通过读取jar包中的配置信息&#xff0c;并根据项目依赖和条件注解自动配置应用程序所需的bean&#xff0c;从而减少手动配置的工作量。 第一、代码入口 SpringBootApplication &#x1f447; EnableAutoConfiguration &#…...

bash: docker-compose: 未找到命令

bash: docker-compose: 未找到命令 在一台新的服务器上使用 docker-compose 命令时&#xff0c;报错说 docker-compose 命令找不到&#xff0c;在网上试了一些安装方法&#xff0c;良莠不齐&#xff0c;所以在这块整理一下&#xff0c;如何正确快速的安装 docker-compose cd…...

linux 权限和权限的设置

在Linux中&#xff0c;文件和目录的权限是一个重要的安全特性。这些权限决定了哪些用户可以读取、写入或执行某个文件或目录。以下是关于Linux权限和如何设置它们的基本信息。 权限类型 Linux中有三种基本的权限类型&#xff1a; 读取&#xff08;r&#xff09;&#xff1a;…...

基于Springboot的旅游管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的旅游管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…...

springboot3项目练习详细步骤(第一部分:用户业务模块)

目录 环境准备 用户模块 注册 注册接口文档 ​编辑 实现结构 Spring Validation 登录 登录的接口文档 实现登录逻辑 JWT令牌 完善登录认证 拦截器 获取用户详细信息 接口文档 Usercontroller类中编写方法接口 忽略属性返回 优化代码ThreadLocal 更新用户基本信…...

推荐算法顶会论文博客笔记合集

小小挖掘机学习笔记 https://mp.weixin.qq.com/s/rp2xXueEyT8IKvTr2Qss3A 推荐系统学习笔记 https://blog.csdn.net/wuzhongqiang/category_10128687.html SIGIR SIGIR 2022 | 推荐系统相关论文分类整理&#xff1a;8.74 https://mp.weixin.qq.com/s/vH0qJ-jGHL7s5wSn7Oy…...

DRM/RESP无法连接linux上redis的原因

问题一&#xff1a; redis.conf配置文件 进入到自己的redis软件目录 vim redis.conf 将bind 127.0.0.1 : 1 注释掉&#xff0c;改成bind 0.0.0.0&#xff0c;让远程所有ip都可以访问 将daemonize yes 守护进程&#xff0c;修改后可在后台运行 protected-mod…...

vim怎么选中多行后在头部插入#(随手记)

方法1 进入可视行模式&#xff1a; 按下 V&#xff08;大写 V&#xff09;&#xff0c;选中整行&#xff0c;包括行尾空白字符。使用 v&#xff08;小写 v&#xff09;&#xff0c;然后移动光标选择从行中间开始的多行。 插入 #&#xff1a; 选中多行后&#xff0c;使用 I&…...

Objective-C的对象复制与拷贝选项

对象复制与拷贝 文章目录 对象复制与拷贝copy与mutablecopycopy与mutablecopy的简介示例&#xff1a;不可变对象的复制可变对象的复制 NSCopying和NSMutableCopying协议深复刻和浅复刻浅拷贝&#xff08;Shallow Copy&#xff09;&#xff1a;深拷贝&#xff08;Deep Copy&…...

HTML5 中的离线缓存机制,即应用缓存(Application Cache 或 AppCache)已被废弃并正在被逐步移除

HTML5 中的离线缓存机制&#xff0c;即应用缓存&#xff08;Application Cache 或 AppCache&#xff09;已被废弃并正在被逐步移除。这是因为应用缓存存在一些设计上的缺陷和限制&#xff0c;导致它在实际应用中经常出现问题。 取而代之的是一种更强大、更灵活的技术——Servi…...

vue3+ant design实现表格数据导出Excel

提示:实现表格数据导出Excel 文章目录 前言 一、安装ant design? 二、引用ant design 1.搭建框架 2.获取表格数据 三、封装导出表格的代码 四、导出 1.获取导出地址 2.在下载导出事件中添加导出代码 五、全部代码 前言 今天终于有时间来更新文章了,最近公司项目比较紧…...

VBA_NZ系列工具NZ06:VBA创建PDF文件说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…...

Git === Git概述 Git安装

第1章 Git概述 Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。 Git易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性。其性能优于Subversion…...

Linux diff命令(比较两个文件或目录的内容差异)

文章目录 Linux diff 命令详解教程基本用法比较文件输出解释 递归比较&#xff08;-r&#xff09;示例代码 控制输出格式统一格式&#xff08;-u&#xff09;上下文格式&#xff08;-c&#xff09; 高级选项忽略所有空白差异&#xff08;-w&#xff09;仅报告文件是否不同 Linu…...

从传统到现代:水表的远程抄表革命

1.引言&#xff1a;技术驱动的转型 在过去的几十年里&#xff0c;我们的生活方式被科技的快速发展深深影响&#xff0c;其中就包括了公用设施的管理方式。传统水表的远程抄表系统就是这样一个例子&#xff0c;它将老旧的手动抄表模式转变为高效、精确的自动化系统。 2.传统水…...