基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像

2023-05-16

基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像

  • Linux 环境说明
    • Debian 简介
    • Debian 发行版本
    • 关于 Debian 11
  • Linux 常用基础工具
  • Dockerfile 中 RUN 指令
    • RUN 语法格式
    • RUN 语义说明
  • 编写 Dockerfile 构建 Runtime 基础镜像
    • ASP.NET Core Runtime 基础镜像
    • Dockerfile 编写
    • Windows 环境使用 WSL2 安装 Docker Desktop 工具
    • docker build 构建 image 镜像
    • 查看 docker 镜像信息
  • 总结

dotnet 跨平台

Linux 环境说明

此处我们基于 Debian11Linux 发行版,实现目标是编写 Dockerfile 构建 asp.net core 6.x 框架的 runtime 基础镜像。

在 Docker 容器化运行环境中,应用程序运行中存在异常情况,此时可以借助一些常用的基础工具方便排查,因此我们需要在 asp.net core 6.x runtime 基础镜像添加 linux 环境常用的基础工具。

注意:基础镜像的构建需要考虑镜像的体积和打包工具的安全隐患,此处不做过多讨论。

Debian 简介

1、Debian 是一个社区

来自世界各地的数以千计的志愿者共同为 Debian 操作系统工作,注重自由和开源软件。认识 Debian 计划。

2、Debian 是一个操作系统

Debian 是一个自由的操作系统,由 Debian 计划开发和维护。Debian 是一个自由的 Linux 发行版,添加了数以千计的应用程序以满足用户的需要。

关于 Debian 更多信息,请查看 => https://www.debian.org/intro/index.zh-cn.html

Debian 发行版本

Debian 一直维护着至少三个发行版本:稳定版(stable),测试版(testing)和不稳定版(unstable)

1、稳定版(stable

  • 稳定版包含了 Debian 官方最近一次发行的软件包。
  • 作为 Debian 的正式发行版本,它是我们优先推荐给用户您选用的版本。
  • 当前 Debian 的稳定版版本号是 11,开发代号为 bullseye。最初版本为 11.0,于 2021 年 08 月 14 日发布,其更新 11.6 已于 2022 年 12 月 17 日发布。

2、测试版(testing)

  • 测试版包含了那些暂时未被收录进入稳定版的软件包,但它们已经进入了候选队列。使用这个版本的最大益处在于它拥有更多版本较新的软件。
  • 想要了解 什么是测试版以及 如何成为稳定版的更多信息,请看 Debian FAQ
  • 当前的测试版版本代号是 bookworm

3、不稳定版(unstable)

  • 不稳定版存放了 Debian 现行的开发工作。通常,只有开发者和那些喜欢过惊险刺激生活的人选用该版本。推荐使用不稳定版的用户订阅 debian-devel-announce 邮件列表,以接收关于重大变更的通知,比如有可能导致问题的升级。
  • 不稳定版的版本代号永远都被称为 sid。

4、发行生命周期

Debian 通常会按照一定的规律每隔一段时间发布一个新稳定版。 对每个稳定发行版本,用户可以得到三年的完整支持以及额外两年的长期支持。

请查看 Debian Releases 维基页面和 Debian LTS 维基页面以了解详细信息。

更多详细信息,请查看 => https://www.debian.org/releases/

关于 Debian 11

Debian 11 带有 Linux 5.10 内核,这是一个长期支持(LTS)版本。一个新的内核显然意味着对硬件有更好的支持,特别是较新的硬件以及性能的改进。

在这里插入图片描述

这里我们使用 Debian 11,代号为 bullseye,网络安装,用于 64 位 PC(amd64) debian-11.6.0-amd64-netinst.iso

关于 Debian 11 更多信息:

  • 【debian-11.6.0-amd64-netinst.iso】下载地址 => https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.6.0-amd64-netinst.iso
  • 新发布的 Debian 11 “Bullseye” Linux 发行版的 7 大亮点 => https://linux.cn/article-13695-1.html

Linux 常用基础工具

当在 Linux 服务器执行 telnet 命令时,如果提示 command not found: telnet,说明服务器上并未安装 telnet 命令,需要安装此命令。

下面介绍在 linux 服务器如何安装 telnet、curl、ifconfig、vim、ping 等工具。

首先,介绍一个安装工具时必须的命令 apt installapt install 是应用程序管理器,用于一键安装软件包,与源码安装不同的是,该指令会自动检测并安装依赖,而且用 apt 安装的包都是成熟的软件包,基本不存在安装包有严重 bug 或者文件缺失的情况。

# 1、首先执行如下命令,更新相关资源。将所有包的来源更新,也就是提取最新的包信息,这一命令使用率非常高。
apt update

# 2、安装 telnet
apt install telnet

# 3、安装 curl
apt install curl

# 4、安装 ifconfig
apt install net-tools

# 5、安装 vim
apt install vim

# 6、安装ping
apt install inetutils-ping

# 7、安装 ipaddr
apt install iproute2

上面这些基础工具的安装,可以整合一条命令,执行操作如下:

apt update && apt install -y net-tools iproute2 iputils-ping telnet curl vim

执行上面命令,如果不是 root 用户,需在前面添加 sudo 提权,继续执行操作。

Dockerfile 中 RUN 指令

上面我们介绍了 linux 环境中常用的基础工具,此处我们 app 应用程序是容器化运行环境,为了方便排查异常信息,通常会在 runtime 基础镜像中添加一些常用工具。

在编写 Dickerfile 构建 asp.net core runtime 镜像环境时,我们先来了解下 Dockerfile 中的 RUN 指令。

RUN 语法格式

DockerfileRUN 指令的编写格式有两种:

  • shell 形式】,命令在 shell 中运行,默认情况下,Linux/bin/sh -cWindowscmd /S /C

  • exec 形式】,按照 JSON Array 格式解析,意味着必须使用双引号【"】包含参数,而不能使用单引号【’】;

RUN 语义说明

RUN 指令在当前镜像的顶层上新建层执行命令,同时提交执行结果。提交的结果会在接下来的 Dockerfile 处理。

分层 RUN 指令和生成提交符合 Docker 的核心理念,即:提交便利,容器可以依据任意历史镜像构建,像源代码管理一样。

  • exec 形式能够避免 shell 形式表达含义模糊的问题,同时能够在一个不包含 shell 命令的基础镜像上执行 RUN 指令。
  • shell 形式的默认 shell 可以通过 SHELL 修改。
  • shell 形式中,若是指令参数过长,可以使用符号【\】换行显示。
# RUN 参数不换行.
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
# RUN 参数换行.
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
  • exec 形式是按照 JSON Array 格式解析,必须使用双引号【"】包含参数。

与 shell 形式不同,exec 形式不会调用 shell 命令行,意味着不会进行 shell 处理。

=> 例如:运行 `RUN ["echo", "$HOME"]` 不会对 `$HOME` 进行变量替换。
如果需要 shell 处理,那么可以使用 shell 形式或直接执行 shell;
=> 例如:`RUN["sh""-c""echo $HOME"]`。
当使用 exec 形式直接执行 shell 时,与 shell 形式类似,应用的 shell 是宿主机而非 Docker。
  • exec 形式中的 JSON,必须转译反斜杠【\】。Windows 系统中,反斜杠【\】是路径分隔符,是需要特别关注的。否则,由于不是有效的 JSON,执行时会出现异常从而失败。
# 错误写法
RUN ["c:\windows\system32\tasklist.exe"]

# 正确写法
RUN ["c:\\windows\\system32\\tasklist.exe"]
  • RUN 指令的缓存不会在下次构建时自动失效。
RUN apt dist-upgrade -y 指令的缓存将在下次构建时重用。
RUN 指令的缓存可以通过使用 `--no-cache` 标志置为无效,例如:docker build --no-cache
  • RUN 指令的缓存可由 ADDCOPY 指令置为无效。

编写 Dockerfile 构建 Runtime 基础镜像

Docker 中,编写 Dockerfile 是有个细节需要注意,RUN 指令执行多个命令时,可以合并写成一个,在 Dockerfile 中每执行一个指令都会对应的生成一个层,相应的构建镜像的体积也会随之增加。

ASP.NET Core Runtime 基础镜像

  • 微软 MCR 容器镜像仓库,ASP.NET Core Runtime

aspnet

访问地址:https://mcr.microsoft.com/en-us/product/dotnet/aspnet/about

Dockerfile 编写

上面我们介绍了 RUN 指令的语法格式,同样的这里我们为了尽量建设镜像构建的层,通常情况我们会把多个命令整合为一个 RUN 指令执行,完整 Dockerfile 编写如下:

FROM mcr.microsoft.com/dotnet/aspnet:6.0
# Debian 源添加参考
# https://developer.aliyun.com/mirror/debian?spm=a2c6h.13651102.0.0.3e221b1137LtM1
# https://mirrors.ustc.edu.cn/help/debian.html
# https://mirrors.tuna.tsinghua.edu.cn/help/debian/

# RUN 使用 shell 语法
RUN sed -i -E 's/(deb|security).debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN sed -i 's/snapshot.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt update && apt install -y net-tools iproute2 iputils-ping telnet curl vim

# RUN 使用 exec 语法
#RUN ["apt", "update"]
#RUN ["apt","install","-y","vim","curl","telnet","iputils-ping","iproute2","net-tools"]

Windows 环境使用 WSL2 安装 Docker Desktop 工具

注意:在 windows 环境使用 Dockerfile 构建镜像,需要安装 Docker Desktop 工具并启动运行。

Windows 环境安装 Docker Desktop 工具,推荐使用 WSL2 模式运行。此处不过多讲解安装细节,请自行查看资料镜像安装。

docker desktop

Docker Engine 添加如下信息:

{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "dns": [
    "8.8.8.8",
    "8.8.4.4"
  ],
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "insecure-registries": [
    "https://hub.atguigu.com"
  ],
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://mirror.ccs.tencentyun.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://cr.console.aliyun.com/"
  ]
}

docker build 构建 image 镜像

  • 执行 docker build 构建命令:
docker build -t aspnet:6.0-debian11-amd64 ./
  • 输出如下 image 镜像构建步骤信息:
[+] Building 0.6s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 32B                                                                                0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for mcr.microsoft.com/dotnet/aspnet:6.0                                               0.4s
 => [1/5] FROM mcr.microsoft.com/dotnet/aspnet:6.0@sha256:a4ac0ac8b96842c3d4161339e641d335e44f52647bdeb4ed619ac83  0.0s
 => CACHED [2/5] RUN sed -i -E 's/(deb|security).debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list            0.0s
 => CACHED [3/5] RUN sed -i 's/snapshot.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list                    0.0s
 => CACHED [4/5] RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list                         0.0s
 => CACHED [5/5] RUN apt update && apt install -y net-tools iproute2 iputils-ping telnet curl vim                  0.0s
 => exporting to image                                                                                             0.0s
 => => exporting layers                                                                                            0.0s
 => => writing image sha256:8e4e01b9340eef513279899468870ff57826a1e4f3a6f0b3689212d88f3119eb                       0.0s
 => => naming to docker.io/library/aspnet:6.0-debian11-amd64                                                       0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

从上面输出的信息可以看出,Dockerfile 文件中每一行单独编写的命令,都会当做一个步骤执行,一共执行 [5/5] 个步骤。

查看 docker 镜像信息

此时我打开 Docker Desktop 桌面端工具,选择 Images ,搜索框输入 tag 名称【aspnet-debian11-amd64:6.0】就可以看到刚才构建的镜像,体积 270.54 MB

docker images

和原生【mcr.microsoft.com/dotnet/aspnet:6.0】镜像相比,体积增加 170.51 MB,新增的这部分体积,主要是我们在这个镜像的基础上,添加了一些 linux 环境的常用小工具(net-tools、iproute2、iputils-ping、telnet、curl、vim)。

我们可以点击【aspnet-debian11-amd64:6.0】镜像,即可进入镜像查看构建的层信息,如下所示:

image详细信息

查看上面的镜像层信息,同样的我们也可以使用命令操作查看,操作如下:

docker inspect : 获取容器/镜像的元数据。

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS 说明:

  • -f :指定返回值的模板文件。
  • -s :显示总的文件大小。
  • –type :为指定类型返回JSON。

具体命令如下:

 docker inspect aspnet:6.0-debian11-amd64

输出如下信息:

[
    {
        "Id": "sha256:8e4e01b9340eef513279899468870ff57826a1e4f3a6f0b3689212d88f3119eb",
        "RepoTags": [
            "aspnet:6.0-debian11-amd64"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2023-02-19T07:44:04.106566658Z",
        "Container": "",
        "ContainerConfig": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": null,
            "Cmd": null,
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "DockerVersion": "",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "ASPNETCORE_URLS=http://+:80",
                "DOTNET_RUNNING_IN_CONTAINER=true",
                "DOTNET_VERSION=6.0.14",
                "ASPNET_VERSION=6.0.14"
            ],
            "Cmd": [
                "bash"
            ],
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 270542384,
        "VirtualSize": 270542384,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/z1zc2q5ucw0srd1q6fz9dv5zs/diff:/var/lib/docker/overlay2/4vf1uowirpwps4nw4guvfr610/diff:/var/lib/docker/overlay2/xzob6lo9w8ita21r9o6qdowh3/diff:/var/lib/docker/overlay2/1a04b4cea9f8ea832c5f91a20d4ddd4f29f6ec5acb8ebbda6848282ec8159590/diff:/var/lib/docker/overlay2/5036b7ee8c50e873affdb40f9d1fd0e37573631587ed6b1f45347a10995ad935/diff:/var/lib/docker/overlay2/f7d1f588113cb3de37d0cd574614db511a098ba64e18f02ade45cb4b1d431fb6/diff:/var/lib/docker/overlay2/f0c4b961c76c425d8383575ca78c176a890d78d871a5cf60daab2ddc96ffee8d/diff:/var/lib/docker/overlay2/f7c839b494ad006d157084d919c15e812e10e57a8ac1c5cdda4d0150bf494f21/diff",
                "MergedDir": "/var/lib/docker/overlay2/9zxjyc54rcaf107f6cj6fhiax/merged",
                "UpperDir": "/var/lib/docker/overlay2/9zxjyc54rcaf107f6cj6fhiax/diff",
                "WorkDir": "/var/lib/docker/overlay2/9zxjyc54rcaf107f6cj6fhiax/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:4695cdfb426a05673a100e69d2fe9810d9ab2b3dd88ead97c6a3627246d83815",
                "sha256:f30d150c01520fbbbdd1bedcef3f940d809c82a46e08301dcc713903d7272ba3",
                "sha256:fe674e2b138caf1ef6a67419d5fb0a9081ca0759d97ce711be80d5d4d67145e1",
                "sha256:ff13768cb51ea8fe1831d93c2d18690c3fdca8cfee40b75a738f62b133413573",
                "sha256:355b7bb8c23e0d867141b0af69ecb6df39730bcd1b6c754cfae9ad36ca3f5572",
                "sha256:8d56eaae8bfea0a5eac4caf4350fa1987c162cd7dba828aa292cc15c3e90d91b",
                "sha256:b7d0c701d1f04294b2b98d3103c3856c9cbabc592cde48d3e07eb03bff7cb18a",
                "sha256:46ef367d7575beda39ffd3774b4d47b29c2fe0b628f1269b4626053ca44169d5",
                "sha256:6809bcac556f83ca4489ba09980a5bef05c9bc7463a45e4dac7fb600beec1c4e"
            ]
        },
        "Metadata": {
            "LastTagTime": "2023-02-19T08:46:50.196739744Z"
        }
    }
]

镜像构建后,此时如果有镜像仓库(腾讯云平台准备 Docker 私有镜像仓库或者 IDC 机房搭建),确保 vm 和宿主机之间通信可以正常登录访问,此处以腾讯云 Docker 私有镜像仓库为例:

# 登录腾讯云docker registry
sudo docker login --username=[user] ccr.ccs.tencentyun.com
# 提示输入对应的密码即可
 
# 从 registry 拉取镜像
sudo docker pull ccr.ccs.tencentyun.com/dotnet/image-name:[tag]
 
# 将镜像推送到 registry
sudo docker login --username=[user] ccr.ccs.tencentyun.com
sudo docker tag [ImageId|image-name:tag] ccr.ccs.tencentyun.com/dotnet/aspnet:6.0-debian11-amd64
sudo docker push ccr.ccs.tencentyun.com/dotnet/aspnet:6.0-debian11-amd64

到这里我们就演示完 Dockerfile 的编写,以及 image 镜像构建的全过程。

总结

掌握 Dockerfile 文件语法格式的编写,熟悉 RUN 指令中多个命令的编写方式(减少 image 镜像构建层,相应的减少镜像体积大小),顺便熟悉下 Docker 镜像的构建 docker build 和 镜像的 push(推送)和 pull(拉取) 基本操作,感兴趣的小伙伴可以跟随上面描述动手实践起来,可以加深对 Docker 镜像构建的理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像 的相关文章

  • windows 安装 wsl 及 mate 桌面

    windows 安装 wsl 及 mate 桌面 步骤 1 安装 wsl 先打开 wsl 选项 打开终端执行指令 xff1a wsl list online span class token comment 查看可安装版本 span wsl
  • mysql 8.0设置密码 (doc命令)

    1 进入mysql内修改密码 alter user 名字 64 主机名 identified by 34 设置的新密码 34 xff1b 2 不进入mysql内进行修改密码 mysqladmin u用户名 p 旧密码 password 34
  • selenium获取某网站工作岗位信息(含火狐浏览器的驱动下载安装步骤)

    目录 一 说明 二 Firefox驱动下载并配置环境变量 2 1 下载火狐浏览器驱动 2 2 配置驱动环境变量 三 selenium概念 3 1 概念引入 3 2 一些函数 3 2 1 切换不同窗口 3 2 2 切换到不同iframe 3
  • C#中的枚举 Enum和enum的区别

    枚举类型本质上是一个字典 xff0c 它将一组字符串映射到一组整数值 每个枚举常量都具有一个关联的整数值 xff0c 默认情况下 xff0c 第一个枚举常量的值为 0 xff0c 后续枚举常量的值会自动加 1 C 中有两种枚举类型 xff1
  • 【VScode远程连接虚拟机(ubuntu)】

    VScode远程连接虚拟机 前言一 安装VScode二 安装中文插件三 安装其他远程连接插件1 C C 43 43 Extension Pack2 Live Preview3 Live Server4 Remote Development
  • (错误都已改正)AS608指纹+STM32串口通信录入或删除指纹

    目录 一 硬件使用分类 1 整体图展示 2 STM32F103RCT6单片机 3 AS608指纹模块 4 USB转TTL 二 软件设计 1 接线设计 2 程序设计 一 硬件使用分类 1 整体图展示 采用STM32F103RCT6作为主控制器
  • 基于Maix IDE的编程环境 K21O人脸识别+串口输出

    如果你想进行人脸识别首先要进行对K210的模型以及固件的配置 xff0c 在你去Maix官网去下载模型以及固件 目录 一 如何申请机械码 1 前往这个网站 xff0c 也就是Maix的官网 xff08 需要提前申请账号 xff09 2 要进
  • K210模型训练(物体分类)

    目录 一 打开Maix IDE 的官网找到需要训练模型的平台Maix Hub 模型训练的分类 xff1a 二 如何使用Maix Hub模型训练平台 数据集的采集 三 训练模型后的文件分类 一 打开Maix IDE 的官网找到需要训练模型的平
  • Openstack Swift 安装部署总结

    环境 硬件 这里只使用了一台服务器 xff0c 既作为Controller Node xff0c 也作为Storage Node 主机名IPOS磁盘文件系统sf dev10 202 127 4Centos 7 4 dev sdb dev s
  • 针对于esp8266-01的刷AT固件

    目录 1 esp8266 01的结构与引脚分布 1 1对应各引脚的功能分布 2 如何与USB转TTL接线进行刷固件 3 使用 FLASH Download Tool刷固件 3 1打开该文件 3 2按照此选项进行选择 3 3接着进行选择 3
  • 阿里云物联网平台如何进行云产品流转

    一 什么是云产品流转 简单来说就是如何将数据从这个设备发送到另一个设备中 二 如何在同一产品上的俩个设备之间进行数据转移 1 创建一个产品 xff0c 并添加两个设备 可以看到RP DPJ 与RP WX 都是属于RP WXX 产品上的俩个设
  • 本地包含与远程包含

    注意 xff1a 仅用于本人学习的笔记记录 xff0c 禁止进行传播分享 xff0c 一旦造成严重后果与本人无关 xff01 xff01 xff01 一 什么是文件包含漏洞 文件包含 xff1a 就是去其他的php文件读取源码来运行 xff
  • Linux下的shell

    NC反向shell 1 查看shell类型 echo SHELL chsh s 需要修改shell的类型 cat etc shells 查看存在哪些shell 然后反弹对应的shell xff08 正向连接 xff09 被控制端 nc lv
  • 单片机之步进电机驱动篇(一)

    步进电机的简介 xff1a 步进电机是一种将电脉冲转化为角位移的执行机构 当步进电机驱动器接收到一个脉冲信号 xff0c 它就驱动步进电机按设定的方向转动一个步距角 通过控制脉冲来控制角位移量 xff0c 也可以实现对电机的加减速和正反转的
  • ROS使用Python编写的步骤

    第一步 xff1a 和C 43 43 编写一样 xff0c 配置好工作空间 第二步 xff1a 在功能包下面建立一个scripts文件夹 第三步 xff1a 在scripts文件里面建立一个 py文件 第四步 编写python文件 注意 x
  • 解决js脚本加载失败的问题

    当我们在运行某一个项目时 xff0c 它的某些JavaScript脚本可能加载不出来 xff0c 报错 像现在单页界面应用基本上都是通过js来构建 xff0c 一旦加载不出 xff0c 这个项目就不能运行了 xff0c 那怎么办 xff1f
  • 能在 Switch 中使用 String 吗?

    答 xff1a 从 Java 7 开始 xff0c 我们可以在 switch case 中使用字符串 xff0c 但这仅仅是一个语法糖 内部实现在 switch 中使用字符串的 hashCode 补充 xff1a 在JDK7以前 xff0c
  • C语言基础编程练习(精选例题+题解)

    目录 1 求最大公约数和最小公倍数 2 打印图形 3 质数因子 4 数字排序 5 十进制数转换为八进制数 xff08 进制转换 xff09 6 寻找完数 1 求最大公约数和最小公倍数 题目描述 xff1a 输入两个正整数m和n xff0c
  • 判断字符向量是否为回文

    回文是指正读反读均相同的字符序列 xff0c 如 34 abba 34 和 34 abdba 34 均是回文 xff0c 但 34 good 34 不是回文 试写一个算法判定给定的字符向量是否为回文 xff08 提示 xff1a 将一般字符
  • 【matlab】记一次微信聊天文字记录导出到Excel工作

    其实一直想把我和她的微信聊天记录导出到文本 xff0c 整理出来拿出来翻翻 xff0c 然后再查阅了大量网络资料后 xff0c 我成功的将我和她的聊天记录整理成excel的形式 xff0c 如下所示 xff1a 那么我们开始 一 工具准备

随机推荐

  • C语言实现选择排序算法

    选择排序 算法步骤 1 从0索引开始 xff0c 跟后面的元素一一比较 2 小的放前面 xff0c 大的放后面 3 第一次循环结束后 xff0c 最小的数据已经确定 4 第二次循环从一索引开始以此内推 整体代码块在最下方 xff0c 有需要
  • DVWA靶场搭建

    1 靶场是什么 xff0c 靶场的搭建 在学习web安全的过程中 xff0c 靶场是必不可少的 xff0c 毕竟在计算机界 xff0c 任何理论知识都不如实操 靶场就是人为提供的带有安全漏洞的服务 xff0c 每一个学习者都可以在本地快速搭
  • 用HTML+bootstrap制作个人简历

    用HTML bootstrap制作个人简历 nbsp index html lt DOCTYPE html gt lt html lang en gt lt head gt lt meta charset UTF 8 gt lt meta
  • 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理

    上节我们讲了中断的外部中断 xff0c 基本的了解了一下中断 xff0c 这一节我们继续来学习中断系统的定时器中断基本原理 xff0c 本节很重要 无论是在比赛中还是在单片机 嵌入式等的学习上都有着很重要的地位 如对本作者有兴趣可以去我主页
  • 关于本地离线API文档大全-Zeal的下载以及使用

    目录 1 先进zeal官网进行下载对应的版本 2 进入点击edit gt preferents 在directory中设置存放文档的地址 3 进入下面的网址 xff0c 按ctrl 43 f查找所需的语言后复制name属性的值 4 下载文档
  • Vue使用Element Plus

    安装 Element Plus 安装组件 npm install element plus save 在main ts中导入UI 导入饿了么UI组件 import ElementPlus from 39 element plus 39 im
  • 带符号数的移位操作

    算数移位时应保持数的符号位不变 xff0c 数值的大小则要发生变化 左移一位相当于该数乘以2 xff0c 右移一位相当于该数除以2 移位运算有算数移位 逻辑移位和循环移位一共3类 xff0c 每种移位有左移和右移之分 1 算数移位 算数移位
  • Linux复制文件时出现权限不够的问题

    只需两步即可 1 ctrl 43 alt 43 t打开一个终端 2 输入命令sudo nautilus并运行 就可以打开一个具有管理员权限的文件管理器 xff0c 即可在不切换到管理员的条件下复制文件了
  • Unsupported class file major version 61

    简介 xff1a illegalargumentexception 不支持的类文件主版本61 xff0c jdk版本过高 1 项目场景 项目场景 xff1a 在maven框架下 xff0c 基于注解的SpringAOP项目 2 运行结果 3
  • 基于ubuntu 下 vim 入门进阶篇之环境和插件的配置2步完美搞定

    前言 xff1a 本文可以帮助你快速从vi新手到vi熟练使用 xff0c 按照文中的步骤可以使你在1小时之内搞定所有的配置和熟悉vi的基本使用 很早之前就接触vi了 xff0c 但是一直没时间弄插件 xff0c 也就使用了vi的基本功能 x
  • 数据库系统概论——非相关子查询和相关子查询详解

    学生表 课程表 学生选课表 学生表 xff1a Student Sno Sname Sex Sage Sdept 学号Sno 姓名Sname 性别Sex 年龄Sage 所在系Sdept 201215121 李勇 男 20 CS 201215
  • Anconda新建python环境

    文章目录 前言一 使用代码形式创建虚拟环境1 创建虚拟环境2 查看虚拟环境3 激活虚拟环境4 包的下载5 删除虚拟环境 二 图形界面创建虚拟环境总结 前言 本文主要解决使用Anconda创建python虚拟环境 提示 xff1a 以下是本篇
  • 副驾驶员copilot VsCode神级插件,新手慎用!!!

    新人慎用 新人慎用 新人慎用 一 xff0c 安装并申请 1 点击拓展 xff0c 搜索copilot 2 选这个 安装后右下角会弹出使用申请 xff0c 点击后会跳转到GitHub上申请 本插件是需要预约的 xff0c 大概一周左右时间就
  • 54-Linux概述

    Linux系统概述 计算机的体系结构 xff1a 计算机由计算机硬件和计算机软件两个部分组成 xff0c 其中计算机软件 Computer Software 可分为系统软件和应用软件 系统软件就是操作系统 xff0c 是其他软件的基础 Li
  • 实验十五 IS-IS协议基本配置

    实验十五 IS IS协议基本配置 IS IS 中间系统到中间系统 协议与OSPF 开放最短路径优先 协议有许多类似之处 xff0c 如都是链路状态的IGP路由协议 xff0c 采用的都SPF路由算法 xff0c 都划分了区域 为了支持大规模
  • 解决终端输出乱码问题

    乱码 代码 应该输出 王啊hello world 但是输出了乱码 原因 出现乱码问题的根本原因是编码与解码 使用了不同 而且不兼容的 标准 xff0c 在国内一般出现在中文的编解码过程中 解决方法 第一步 右击终端边界 xff0c 点击里面
  • Win10安装JDK11过程及配置

    写在前面 新手小白刚开始学习java xff0c 所以我的电脑未曾安装过jdk xff0c 如果是曾经装过的需要卸载旧版本 卸载注意事项 xff1a 1 找到原有文件 xff0c 删除它 2 选择此电脑 xff0c 右击系统属性 xff0c
  • Springboot启动后找不到接口前台报404

    Postman测试404后台没报错 首先考虑 xff1a 接口是不是被spring管理了 xff0c 没有被管理是找不到的 Controller 层是否添加注解 64 RestController 64 RequestMapping 34
  • VC++中for(i = 1; i < (1 << n); i ++)循环语句中 i < (1 << n)的含义

    lt lt 在VC 43 43 里执行的是位的算术左移 比如a 61 1 lt lt 1 就是1的二进制从右向左移一位 有符号位的左移高位相应补0或者1 移n位就是原十进制数的2 n次方 因为VC 43 43 里整型32 所以最多可以移31
  • 基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像

    基于 Debain11 构建 asp net core 6 x 的基础运行时镜像 Linux 环境说明Debian 简介Debian 发行版本关于 Debian 11 Linux 常用基础工具Dockerfile 中 RUN 指令RUN 语