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

构建Docker镜像的Dockerfile文件详解

文章目录

  • 前言
  • Dockerfile 案例
  • docker build
    • 1. 基本构建
    • 2. 指定 Dockerfile 路径
    • 3. 设置构建时变量
    • 4. 不使用缓存
    • 5. 删除中间容器
    • 6. 拉取最新基础镜像
    • 7. 静默输出
    • 完整示例
  • docker run
  • DockerFile 入门
    • syntax指定构造器
    • FROM基础镜像
    • RUN命令
    • 注释
    • COPY复制
    • ENV设置环境变量
    • EXPOSE暴露端口
    • CMD启动应用程序
    • CMD 和 RUN的区别
    • ENTRYPOINT最终启动命令
    • ENTRYPOINT 与 CMD 的区别
  • 总结

前言

Dockerfile 是一个文本文件,其中包含了若干个命令,用户可以调用这些命令来构建一个镜像。通过这个文件,开发者能够定义应用程序运行环境的所有细节,从基础操作系统的选择到需要安装的软件包,再到启动服务所需的配置。

Dockerfile 不仅是自动化构建的基础,也是实现持续集成和持续部署(CI/CD)流程的关键组成部分。它使得开发团队能够在一致的环境中开发、测试和部署应用,从而减少“在我机器上能跑”的问题。此外,Dockerfile 促进了微服务架构的发展,让每个服务都可以独立打包成容器,易于管理和扩展。

Dockerfile 案例

Dockerfile 有个和其他文件与众不同的点,就是他没有后缀,他全部的名字就叫做Dockerfile 而不是Dockerfile.txt 或者Dockerfile.yml

先来看一个Dockerfile 的案例:

# 使用指定的基础镜像
FROM registry.gitee-ai.local/base/iluvatar-corex:3.2.0-bi100
# 设置工作目录
WORKDIR /app# 添加 Java 环境
RUN apt-get update && \apt-get install -y openjdk-8-jdk && \apt-get clean# 复制当前目录下的所有文件到容器内的/app目录下
COPY . /appEXPOSE 7860# 指定启动命令
ENTRYPOINT ["java","-jar","/app/mergevideo-0.0.1-SNAPSHOT.jar"]
  • FROM registry.gitee-ai.local/base/iluvatar-corex:3.2.0-bi100: 使用指定的基础镜像 iluvatar-corex:3.2.0-bi100 从私有仓库 registry.gitee-ai.local 中拉取。
  • WORKDIR /app: 设置工作目录为 /app
  • RUN apt-get update && apt-get install -y openjdk-8-jdk && apt-get clean: 更新包列表并安装 OpenJDK 8 JDK,然后清理缓存。
  • COPY . /app: 将当前目录下的所有文件复制到容器内的 /app 目录下。
  • EXPOSE 7860: 声明容器监听 7860 端口。
  • ENTRYPOINT ["java","-jar","/app/mergevideo-0.0.1-SNAPSHOT.jar"]: 指定容器启动时运行的命令,使用 Java 启动 /app/mergevideo-0.0.1-SNAPSHOT.jar 应用。

在这里插入图片描述
这个dockerFile几乎覆盖了官方文档中说到了主要几个命令。这里介绍一下: docker build 命令。

docker build 命令可以从 Dockerfile 构建一个新的 Docker 镜像

docker build

基本语法

docker build [OPTIONS] PATH | URL | -

常用选项

  • -t, --tag: 为生成的镜像指定标签(通常是 name:tag 格式)。
  • -f, --file: 指定 Dockerfile 的路径(默认是当前目录下的 Dockerfile)。
  • --build-arg: 设置构建时的变量。
  • --no-cache: 构建时不使用缓存。
  • --rm: 构建完成后删除中间容器(默认是启用的)。
  • --pull: 始终尝试从远程仓库拉取最新版本的基础镜像。
  • -q, --quiet: 只输出构建的镜像 ID

示例

1. 基本构建

假设你的 Dockerfile 位于当前目录下,并且你想为生成的镜像打上标签 my-app:latest,可以使用以下命令:

docker build -t my-app:latest .

这里的 . 表示当前目录。

2. 指定 Dockerfile 路径

如果你的 Dockerfile 不在当前目录下,可以使用 -f 选项指定其路径:

docker build -t my-app:latest -f path/to/Dockerfile .

3. 设置构建时变量

你可以使用 --build-arg 选项传递构建时变量。假设你的 Dockerfile 中使用了 ARG 指令:

ARG BUILD_DATE
RUN echo "Build date: $BUILD_DATE"

你可以这样构建镜像:

docker build -t my-app:latest --build-arg BUILD_DATE=$(date) .

4. 不使用缓存

如果你希望构建时不使用缓存,可以使用 --no-cache 选项:

docker build -t my-app:latest --no-cache .

5. 删除中间容器

默认情况下,构建完成后会删除中间容器。如果你想明确指定这一点,可以使用 --rm 选项:

docker build -t my-app:latest --rm .

6. 拉取最新基础镜像

如果你希望在构建前始终从远程仓库拉取最新版本的基础镜像,可以使用 --pull 选项:

docker build -t my-app:latest --pull .

7. 静默输出

如果你只想输出最终的镜像 ID,可以使用 --quiet-q 选项:

docker build -q -t my-app:latest .

完整示例

假设你有一个复杂的 Dockerfile,并且需要设置多个构建时变量,可以这样构建:

docker build -t my-app:latest \--build-arg BUILD_DATE=$(date) \--build-arg VERSION=1.0.0 \--no-cache \--pull \-f path/to/Dockerfile \.

我们的build命令都会根据DockerFile 里面的内容来一步一步构建我们的镜像,那么介绍了build命令,再来认识一下build之后构建的镜像如何运行

docker run

运行一个 Docker 容器

docker run -d -p 8999:8999 aijava:1.0
  • docker run:这是运行 Docker 容器的命令。
  • -d:表示在后台运行容器。
  • -p 8999:8999:将宿主机的 8999 端口映射到容器的 8999 端口。
  • aijava:1.0:这是要运行的镜像名称和标签。

最后,我们就来认识一下DockerFile里面的命令所代表的意思了

DockerFile 入门

Docker 镜像由层组成。每个层都是构建的结果 指令。层按顺序堆叠,每个层都是 表示应用于上一层的更改的增量。
在这里插入图片描述

syntax指定构造器

# syntax=docker/dockerfile:1# 使用指定的基础镜像
FROM registry.gitee-ai.local/base/iluvatar-corex:3.2.0-bi100

这个是DockerFile中一个特殊的注释

# syntax=docker/dockerfile:1 注释告诉 Docker 使用 BuildKit 构建器来解析和构建 DockerfileBuildKitDocker 的下一代构建工具,旨在提高 Docker 镜像构建的性能和可靠性。它引入了许多新的特性和改进,使其成为比传统 Docker 构建器更强大的工具。

写了这个注释可以让我们利用 BuildKit 的高级特性,还可以提高构建性能和灵活性。如果不写这个注释,Docker 将使用传统的构建器构建镜像

FROM基础镜像

# 使用指定的基础镜像
FROM registry.gitee-ai.local/base/iluvatar-corex:3.2.0-bi100

这块就是告诉docker以 这个镜像为基础构建一个新镜像,大家可以这么理解,需要装修得要毛坯房吧,而这个基础的镜像就是毛坯房,一般我们使用 FROM Linux系统 这样的写法,因为我们自己构建的镜像其实本质也是运行在一个系统中的,就像我们上面的案例:

# 使用指定的基础镜像
FROM registry.gitee-ai.local/base/iluvatar-corex:3.2.0-bi100
# 设置工作目录
WORKDIR /app# 添加 Java 环境
RUN apt-get update && \apt-get install -y openjdk-8-jdk && \apt-get clean

ubuntu的镜像基础上,安装Java 环境,而这里的结构图就像这样:
在这里插入图片描述

这样是不是大家就很好理解这句话了:层按顺序堆叠,每个层都是 表示应用于上一层的更改的增量(Docker images consist of layers. Each layer is the result of a build instruction in the Dockerfile. Layers are stacked sequentially, and each one is a delta representing the changes applied to the previous layer.)。

registry.gitee-ai.local/base/iluvatar-corex:3.2.0-bi100这个镜像就是一个新镜像,类比我们结构图中的 新镜像A

RUN命令

就是案例中的

# 添加 Java 环境
RUN apt-get update && \apt-get install -y openjdk-8-jdk && \apt-get clean

这个命令会在上面的镜像的基础上运行一些命令,例如这里写的就是安装jdk环境,因为再官方提供的那个镜像是没有jdk环境的,所以运行了这个命令之后,在这个镜像中就有了Java应用所需要的jdk环境

注释

这个就对应开发者来说太熟悉了,就是注释,例如上面的 # 添加 Java 环境 写了这个dockerfile在构建的过程中就会跳过这个注释,很好理解

COPY复制

这个语法是会将你与dockerfile同路径的文件复制到一个新的目录下面,而新的目录你可以理解为linux中的目录,例如 /就是可以理解为新镜像中的根目录,例如上面作者的案例就是把所有文件复制到 /app目录

# 复制当前目录下的所有文件到容器内的/app目录下
COPY . /app

如果你要指定某个文件的话,例如jar包可以这样写:

COPY ./masiyi.jar /app
# 或者这样
COPY masiyi.jar /app

ENV设置环境变量

这个命令设置环境变量,如果熟悉shell命令的同学有福了,就类似那种的设置

VARIABLE_NAME=value

dockerfile使用 ENV作为标识,例如在生产过程中你可以这样写:

ENV MAX_HEAP 2048m
ENV MIN_HEAP 1024mCMD java -jar  -Xms${MIN_HEAP} -Xmx${MAX_HEAP}  masiyi.jar 

这样就可以使用变量来控制jvm的大小了

EXPOSE暴露端口

这块也很好理解,如果你是web服务,需要一个端口,这里只需要和你的web服务保持一样就好了

CMD启动应用程序

这里是容器启动时所调用的命令,例如上面的

CMD java -jar  -Xms${MIN_HEAP} -Xmx${MAX_HEAP}  masiyi.jar 

最后你在启动这个镜像的时候就会构建一个容器,从而执行这个命令,这样一个jar包就被启动起来了。但是很多同学容易把CMD和上面的RUN搞混淆,我们来了解一下他们有什么区别

CMDRUNDockerfile 中用于指定命令的两个不同指令,它们在 Docker 镜像构建和容器运行过程中扮演着不同的角色。

CMD 和 RUN的区别

1. 执行时机
RUN:

  • 执行时机: 在 构建镜像时执行。
  • 作用: 用于在构建过程中执行命令,通常用于安装软件、配置环境等。
  • 结果: 执行的结果会被保存到镜像的层中,成为镜像的一部分。

CMD:

  • 执行时机: 在 启动容器时执行。
  • 作用: 用于指定容器启动时默认执行的命令或参数。
  • 结果: 只在容器启动时生效,不会影响镜像的构建过程。

2. 命令执行方式
RUN:

  • 每次执行 RUN 指令时,Docker 会创建一个新的中间层,执行该命令,并将结果保存到这个层中。多个 RUN 指令会导致多个层的创建。
  • 例如,RUN apt-get update && apt-get install -y curl 会在构建镜像时安装 curl,并且这个安装结果会被保存到镜像中。

CMD:

  • CMD 指定的命令只在容器启动时执行,不会在构建镜像时执行。
  • 如果你在运行容器时指定了其他命令(例如通过 docker run 的命令行参数),CMD 中的命令会被覆盖。
  • 例如,CMD ["java", "-jar", "app.jar"] 会在容器启动时运行 java -jar app.jar,但如果你在 docker run 时指定了其他命令,CMD 中的命令将不会执行。

3. 可覆盖性
RUN:

  • 不可覆盖: RUN 指令在构建镜像时执行,生成的层是镜像的一部分,无法在运行容器时被覆盖或修改。

CMD:

  • 可覆盖: CMD 指令可以在运行容器时被覆盖。你可以通过 docker run 命令行参数指定不同的命令来替代 CMD 中的默认命令。

  • 例如,如果你有一个 Dockerfile 如下:

CMD ["echo", "Hello, World!"]

你可以通过以下命令覆盖 CMD

docker run my-image echo "Hello, Docker!"

4. 多条指令的行为
RUN:

  • 你可以有多个 RUN 指令,每个 RUN 指令都会创建一个新的层。为了减少镜像的层数,建议将多个相关的命令合并为一个 RUN 指令,使用 && 连接多个命令。
  • 例如:
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*

CMD:

  • 你只能有一个 CMD 指令。如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 会生效。

  • 例如:

CMD ["echo", "First command"]
CMD ["echo", "Second command"]  # 只有这一条会生效

示例
使用 RUN 安装软件

# 安装 curl
RUN apt-get update && apt-get install -y curl

使用 CMD 启动应用程序

# 启动 Java 应用
CMD ["java", "-jar", "app.jar"]

ENTRYPOINT最终启动命令

不知道大家注意到一个细节没有,那就是dockerfile中的命令基本都是大写,那么最后一个要介绍一个命令就是ENTRYPOINT

ENTRYPOINTDockerfile 中的一个重要指令,用于定义容器启动时执行的主命令。与 CMD 不同,ENTRYPOINT 提供了一种更灵活的方式来指定容器的默认行为,并且可以与 CMD 结合使用以提供更多的灵活性。

例如上面的案例:

# 指定启动命令
ENTRYPOINT ["java","-jar","/app/mergevideo-0.0.1-SNAPSHOT.jar"]

这个就会在容器启动的时候执行 java -jar /app/mergevideo-0.0.1-SNAPSHOT.jar

这是他的一个最基础的用法,但是ENTRYPOINTCMD 可以一起使用,CMD 提供的参数会被传递给 ENTRYPOINT 指定的命令。这种组合非常有用,尤其是当你希望容器在启动时执行一个特定的命令,但允许用户通过 docker run 提供额外的参数时。

# 使用 ENTRYPOINT 和 CMD 启动 Java 应用
ENTRYPOINT ["java", "-jar"]
CMD ["/app/mergevideo-0.0.1-SNAPSHOT.jar"]
  • 解释:

    • ENTRYPOINT ["java", "-jar"] 指定了容器启动时的主命令是 java -jar
    • CMD ["/app/mergevideo-0.0.1-SNAPSHOT.jar"] 提供了默认的参数 /app/mergevideo-0.0.1-SNAPSHOT.jar
    • 当你运行 docker run my-image 时,容器会执行 java -jar /app/mergevideo-0.0.1-SNAPSHOT.jar
  • 覆盖 CMD:

    • 如果你在 docker run 时提供了其他参数,CMD 中的参数会被覆盖。
    • 例如:
docker run my-image another-app.jar

这将执行

java -jar another-app.jar

ENTRYPOINT 与 CMD 的区别

特性ENTRYPOINTCMD
执行时机容器启动时执行容器启动时执行,默认参数可以被覆盖
是否可覆盖不可覆盖,除非使用 --entrypoint 选项可以通过 docker run 命令行参数覆盖
用途定义容器的主命令,适合创建可执行容器提供默认参数或命令,适合提供默认行为
docker run 的关系docker run 参数会作为 ENTRYPOINT 的参数传递docker run 参数会覆盖 CMD 中的默认参数

总结

至此,我们已经学到了dockerfile中最常用的命令,至于其他的都是作为特殊需求或者更定制化的dockerfile脚本去使用,而这篇文章中的命令基本可以作为企业中的dockerfile使用,当然,dockerfile的语法远远不值这么简单,那么更多的信息可以参考官方文档:https://docs.docker.com/reference/dockerfile/

相关文章:

构建Docker镜像的Dockerfile文件详解

文章目录 前言Dockerfile 案例docker build1. 基本构建2. 指定 Dockerfile 路径3. 设置构建时变量4. 不使用缓存5. 删除中间容器6. 拉取最新基础镜像7. 静默输出完整示例 docker runDockerFile 入门syntax指定构造器FROM基础镜像RUN命令注释COPY复制ENV设置环境变量EXPOSE暴露端…...

Shell 解释器​​ bash 和 dash 区别

bash 和 dash 都是 Unix/Linux 系统中的 ​​Shell 解释器​​,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比: ​​1. 基本区别​​ ​​特性​​​​bash (Bourne-Again SHell)​​​​dash (Debian Almquist SHell)​​​​来源​​G…...

从0开始学习R语言--Day17--Cox回归

Cox回归 在用医疗数据作分析时,最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据,往往会有很多的协变量,即使我们通过计算来减少指标对结果的影响,我们的数据中依然会有很多的协变量,且…...

ABAP设计模式之---“Tell, Don’t Ask原则”

“Tell, Don’t Ask”是一种重要的面向对象编程设计原则,它强调的是对象之间如何有效地交流和协作。 1. 什么是 Tell, Don’t Ask 原则? 这个原则的核心思想是: “告诉一个对象该做什么,而不是询问一个对象的状态再对它作出决策。…...

Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)

13.2. Oracle for Linux物理DG环境搭建 Oracle 数据库的DataGuard技术方案,业界也称为DG,其在数据库高可用、容灾及负载分离等方面,都有着非常广泛的应用,对此,前面相关章节已做过较为详尽的讲解,此处不再赘述。 需要说明的是, DG方案又分为物理DG和逻辑DG,两者的搭建…...

CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found

Nginx1.24编译时,报LuaJIT2.x错误, configuring additional modules adding module in /www/server/nginx/src/ngx_devel_kit ngx_devel_kit was configured adding module in /www/server/nginx/src/lua_nginx_module checking for LuaJIT 2.x ... not…...

IP选择注意事项

IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时,需要考虑以下参数,然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer...

虚拟机网络不通的问题(这里以win10的问题为主,模式NAT)

当我们网关配置好了,DNS也配置好了,最后在虚拟机里还是无法访问百度的网址。 第一种情况: 我们先考虑一下,网关的IP是否和虚拟机编辑器里的IP一样不,如果不一样需要更改一下,因为我们访问百度需要从物理机…...

SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动

飞书文档https://x509p6c8to.feishu.cn/wiki/SKZzwIRH3i7lsckUOlzcuJsdnVf I2S简介 I2S(Inter-Integrated Circuit Sound)是一种用于传输数字音频数据的通信协议,广泛应用于音频设备中。 ESP32-S3 包含 2 个 I2S 外设,通过配置…...

比较数据迁移后MySQL数据库和ClickHouse数据仓库中的表

设计一个MySQL数据库和Clickhouse数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

break 语句和 continue 语句

break语句和continue语句都具有跳转作用&#xff0c;可以让代码不按既有的顺序执行 break break语句用于跳出代码块或循环 1 2 3 4 5 6 for (var i 0; i < 5; i) { if (i 3){ break; } console.log(i); } continue continue语句用于立即终…...

使用 uv 工具快速部署并管理 vLLM 推理环境

uv&#xff1a;现代 Python 项目管理的高效助手 uv&#xff1a;Rust 驱动的 Python 包管理新时代 在部署大语言模型&#xff08;LLM&#xff09;推理服务时&#xff0c;vLLM 是一个备受关注的方案&#xff0c;具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…...

【Linux】使用1Panel 面板让服务器定时自动执行任务

服务器就是一台24小时开机的主机&#xff0c;相比自己家中不定时开关机的主机更适合完成定时任务&#xff0c;例如下载资源、备份上传&#xff0c;或者登录某个网站执行一些操作&#xff0c;只需要编写 脚本&#xff0c;然后让服务器定时来执行这个脚本就可以。 有很多方法实现…...

Python爬虫(四):PyQuery 框架

PyQuery 框架详解与对比 BeautifulSoup 第一部分&#xff1a;PyQuery 框架介绍 1. PyQuery 是什么&#xff1f; PyQuery 是一个 Python 的 HTML/XML 解析库&#xff0c;它采用了 jQuery 的语法风格&#xff0c;让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总...

LINUX编译vlc

下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总&#xff08;最简化&#xff09;_底部的附件列表中】: ffmpeg - lzip…...

初级程序员入门指南

初级程序员入门指南 在数字化浪潮中&#xff0c;编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言&#xff0c;明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 &#xff08;一&#xff09;编程语言抉择 编…...

WinUI3开发_使用mica效果

简介 Mica(云母)是Windows10/11上的一种现代化效果&#xff0c;是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果&#xff0c;Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...

Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集

目录 一、引言&#xff1a;当爬虫遭遇"地域封锁"二、背景解析&#xff1a;分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计&#xff1a;Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...

MyBatis-Plus 常用条件构造方法

1.常用条件方法 方法 说明eq等于 ne不等于 <>gt大于 >ge大于等于 >lt小于 <le小于等于 <betweenBETWEEN 值1 AND 值2notBetweenNOT BETWEEN 值1 AND 值2likeLIKE %值%notLikeNOT LIKE %值%likeLeftLIKE %值likeRightLIKE 值%isNull字段 IS NULLisNotNull字段…...

华为OD机考- 简单的自动曝光/平均像素

import java.util.Arrays; import java.util.Scanner;public class DemoTest4 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint[] arr Array…...

C/Python/Go示例 | Socket Programing与RPC

Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流&#xff0c;会涉及到许多有意思的话题&#xff0c;诸如怎么确保对方能收到信息&#xff0c;怎么应对数据丢失、被污染或者顺序混乱&#xff0c;怎么提高…...

Spring是如何实现无代理对象的循环依赖

无代理对象的循环依赖 什么是循环依赖解决方案实现方式测试验证 引入代理对象的影响创建代理对象问题分析 源码见&#xff1a;mini-spring 什么是循环依赖 循环依赖是指在对象创建过程中&#xff0c;两个或多个对象相互依赖&#xff0c;导致创建过程陷入死循环。以下通过一个简…...

C++ Saucer 编写Windows桌面应用

文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架&#xff0c;开发Windows桌面应用&#xff0c;把一个html页面作为GUI设计放到Saucer里&#xff0c;隐藏掉运行时弹…...

中国政务数据安全建设细化及市场需求分析

(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...

【AI News | 20250609】每日AI进展

AI Repos 1、OpenHands-Versa OpenHands-Versa 是一个通用型 AI 智能体&#xff0c;通过结合代码编辑与执行、网络搜索、多模态网络浏览和文件访问等通用工具&#xff0c;在软件工程、网络导航和工作流自动化等多个领域展现出卓越性能。它在 SWE-Bench Multimodal、GAIA 和 Th…...

轻量安全的密码管理工具Vaultwarden

一、Vaultwarden概述 Vaultwarden主要作用是提供一个自托管的密码管理器服务。它是Bitwarden密码管理器的第三方轻量版&#xff0c;由国外开发者在Bitwarden的基础上&#xff0c;采用Rust语言重写而成。 &#xff08;一&#xff09;Vaultwarden镜像的作用及特点 轻量级与高性…...

SQLSERVER-DB操作记录

在SQL Server中&#xff0c;将查询结果放入一张新表可以通过几种方法实现。 方法1&#xff1a;使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构&#xff08;包括列名和数据类型&#xff09;将与查询结果匹配。 SELECT * INTO 新…...

开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例

在工业自动化控制系统中&#xff0c;常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中&#xff0c;客户现场采用了 罗克韦尔PLC&#xff0c;但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控&#xff0c;引入了开疆智能Etherne…...