Docker 安装部署全流程使用指南(Linux 通用版)

Docker 安装部署全流程使用指南(Linux 通用版)

整合 Docker 安装、配置、核心使用(含日志管理)、路径修改、Dockerfile 构建镜像等全维度内容,适配 Debian/Ubuntu(apt)、CentOS/RHEL(yum/dnf)等主流 Linux 发行版,无特定系统适配内容。

一、Linux 通用版 Docker 安装

1. 前置准备:卸载旧版本

# 通用卸载命令(适配apt/yum/dnf) sudo apt remove -y docker docker-engine docker.io containerd runc # Debian/Ubuntu # 或 sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine containerd runc # CentOS/RHEL 

2. 分体系安装(apt/yum)

方式 1:Debian/Ubuntu(apt 体系)
# 1. 安装依赖 sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release # 2. 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg # 3. 配置Docker源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 4. 安装Docker核心组件 sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 5. 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker 
方式 2:CentOS/RHEL(yum/dnf 体系)
# 1. 安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 2. 配置Docker源 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 3. 安装Docker核心组件 sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 4. 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker 

3. 验证安装成功

# 查看Docker版本 docker --version # 运行测试容器 sudo docker run hello-world # 输出“Hello from Docker!”即为安装成功 

二、镜像加速配置(通用版)

默认从 Docker 官方仓库拉取镜像速度慢,配置国内镜像源是必做优化:

# 1. 创建Docker配置目录 sudo mkdir -p /etc/docker # 2. 写入国内镜像加速源(通用高效源) sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://dockerhub.azk8s.cn", "https://mirror.baidubce.com/docker-registry/" ] } EOF # 3. 重启Docker使配置生效 sudo systemctl daemon-reload sudo systemctl restart docker # 验证加速配置 docker info | grep "Registry Mirrors" # 输出配置的镜像源即为生效 

三、Docker 核心使用详解

1. 镜像 / 容器 / 卷的默认存储路径

Docker 的镜像、容器、卷共享同一个根存储目录,不同类型数据为该目录下的子文件夹:

数据类型通用默认路径说明
镜像/var/lib/docker/image/镜像分层存储,不同存储驱动(如 overlay2)对应子目录
容器/var/lib/docker/containers/每个容器对应一个目录,包含日志、配置、容器运行时数据
卷(Volume)/var/lib/docker/volumes/自定义卷的默认存储位置,推荐优先使用卷而非直接挂载本地目录
容器日志/var/lib/docker/containers/<容器ID>/<容器ID>-json.log默认日志文件(json-file 驱动),按容器 ID 存储

查看路径的通用方法

# 1. 查看Docker根存储目录(最核心) docker info | grep "Docker Root Dir" # 2. 查看存储目录结构 ls -lh /var/lib/docker/ # 3. 查看镜像/容器/卷占用空间 docker system df # 4. 查看指定容器的日志文件路径(示例:容器名为demo-app) docker inspect --format='{{.LogPath}}' demo-app 

2. 容器文件映射(本地 ↔ 容器)

核心分 2 种方式,优先使用卷挂载(生产环境),绑定挂载适合开发调试:

方式 1:绑定挂载(直接映射本地目录)

语法docker run -v 本地绝对路径:容器内路径 [镜像名]

# 示例1:将本地/opt/nginx/html映射到容器nginx默认页面目录 sudo docker run -d -p 80:80 -v /opt/nginx/html:/usr/share/nginx/html nginx # 示例2:持久化容器日志到本地 sudo docker run -d -p 80:80 -v /var/log/nginx-container:/var/log/nginx nginx 

⚠️ 注意:本地路径必须写绝对路径,容器内路径需匹配应用实际路径。

方式 2:卷挂载(Docker 管理的存储卷,推荐)

语法:先创建卷 → 挂载到容器

# 1. 创建自定义卷 sudo docker volume create nginx-data # 2. 挂载卷到容器 sudo docker run -d -p 80:80 -v nginx-data:/usr/share/nginx/html nginx # 3. 查看卷详情(含实际存储路径) sudo docker volume inspect nginx-data 
两种挂载方式对比
特性绑定挂载卷挂载
路径管理手动管理本地路径Docker 自动管理
跨平台 / 迁移差(依赖本地路径)优(可直接备份 / 迁移卷)
权限 / 稳定性易出权限问题适配 Docker 权限,更稳定
适用场景开发调试、实时同步生产环境、数据持久化

3. Docker 日志管理(核心)

3.1 日志默认机制

Docker 默认使用json-file日志驱动,将容器日志以 JSON 格式存储在本地文件(路径见 1. 存储路径),核心特点:

  • 日志按容器独立存储,无集中管理;
  • 默认无大小 / 数量限制,易导致磁盘占满(需手动配置轮转);
  • 支持通过docker logs命令便捷查看。
3.2 查看容器日志的常用命令

docker logs是查看容器日志的核心命令,支持多种筛选方式:

# 基础用法:查看指定容器的所有日志(容器名/容器ID均可) docker logs demo-app # 1. 实时查看日志(类似tail -f) docker logs -f demo-app # 2. 查看最后N行日志(示例:最后100行) docker logs --tail=100 demo-app # 3. 查看指定时间后的日志(支持绝对时间/相对时间) docker logs --since="2024-01-01 08:00:00" demo-app # 绝对时间 docker logs --since=1h demo-app # 1小时内的日志 # 4. 查看指定时间范围的日志 docker logs --since="2024-01-01 08:00:00" --until="2024-01-01 09:00:00" demo-app # 5. 显示日志时间戳 docker logs -t demo-app # 6. 组合用法:实时查看最后50行带时间戳的日志 docker logs -f -t --tail=50 demo-app 
3.3 配置日志驱动(全局 / 容器级)

日志驱动决定 Docker 如何存储 / 输出容器日志,常用驱动及场景:

驱动类型核心特点适用场景
json-file本地 JSON 文件存储,默认驱动单机、小规模部署
local本地日志轮转存储(自动切割),性能优于 json-file单机、需日志轮转的场景
journald集成系统 journald 日志服务,支持系统级日志管理基于 systemd 的 Linux 系统
syslog输出到 syslog 服务器,支持集中日志管理多机、集中日志收集
none禁用日志存储无需日志的临时容器
配置方式 1:全局配置(所有容器生效)

修改daemon.json,重启 Docker 后生效:

# 示例:全局使用local驱动,并配置日志轮转 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ], "log-driver": "local", # 全局日志驱动 "log-opts": { "max-size": "100m", # 单个日志文件最大100MB "max-file": "5", # 最多保留5个日志文件 "compress": "true" # 压缩旧日志文件 } } EOF # 重启生效 sudo systemctl daemon-reload sudo systemctl restart docker 
配置方式 2:容器级配置(覆盖全局,仅当前容器生效)

运行容器时通过--log-driver--log-opt指定:

# 示例:运行nginx容器,单独配置日志轮转(json-file驱动) docker run -d -p 80:80 \ --name nginx-app \ --log-driver=json-file \ --log-opt max-size=50m \ --log-opt max-file=3 \ nginx 
3.4 日志持久化与清理
方式 1:日志文件绑定挂载(持久化到本地指定目录)
# 示例:将nginx容器的日志同时输出到本地/var/log/nginx-docker目录 docker run -d -p 80:80 \ --name nginx-app \ -v /var/log/nginx-docker:/var/log/nginx \ # 容器内日志目录映射到本地 nginx 
方式 2:清理无用日志(释放磁盘空间)
# 1. 清理单个容器的日志文件(需先停止容器) docker stop demo-app sudo rm -rf $(docker inspect --format='{{.LogPath}}' demo-app) docker start demo-app # 2. 批量清理所有容器的日志(谨慎执行) sudo find /var/lib/docker/containers/ -name "*.log" -type f -delete # 3. 使用Docker系统清理命令(清理未运行容器、无用镜像、日志等) docker system prune -a # 加-f可免确认,谨慎执行 
3.5 日志常见问题解决
  1. 日志文件过大占满磁盘:配置max-size/max-file日志轮转(推荐local驱动);
  2. 日志乱码:容器内程序输出编码与终端不一致,运行容器时添加-e LANG=C.UTF-8
  3. 日志实时查看卡顿:日志文件过大导致,先清理旧日志,配置轮转;
  4. 日志丢失:容器重启后日志消失→检查日志驱动(json-file/local不会丢失,none会禁用日志)。

4. 使用 Dockerfile 构建自定义镜像(完整流程)

4.1 Dockerfile 核心认知

Dockerfile 是一个纯文本配置文件,包含一系列按顺序执行的指令,Docker 通过读取这些指令自动构建镜像。核心特点:

  • 每一条指令对应镜像的一个 “分层”,分层存储是 Docker 镜像的核心特性(可复用、减少冗余);
  • 构建镜像时,Docker 会从 Docker Hub 拉取基础镜像(若本地没有),再逐层执行指令;
  • 构建结果是一个可直接运行的自定义镜像,可推送到仓库或本地运行。
4.2 Dockerfile 核心指令(必掌握)
指令核心作用示例注意事项
FROM指定基础镜像(必填,所有镜像都基于某个基础镜像构建)FROM nginx:1.24-alpine优先选择轻量镜像(如 alpine 版本),减少镜像体积;scratch表示空镜像(仅用于编译后的二进制程序)
WORKDIR设置容器的工作目录(后续指令均在此目录执行)WORKDIR /usr/app推荐用绝对路径,多次使用会切换目录;若目录不存在,Docker 会自动创建
COPY复制本地文件 / 目录到容器中(最常用)COPY ./app.py /usr/app/第一个参数是 “构建上下文” 内的路径,第二个是容器内路径;仅复制文件,不解压
ADD复制文件 / 目录,支持解压压缩包、拉取远程文件(慎用)ADD ./app.tar.gz /usr/app/会自动解压.tar/.gz等压缩包;远程文件建议用RUN wget替代,更可控
RUN构建镜像时执行命令(如安装依赖、创建目录)RUN pip install flask多行RUN建议用&&合并,减少镜像分层(如RUN yum install -y nginx && yum clean all
ENV设置环境变量(容器运行时也生效)ENV PYTHONPATH=/usr/app PORT=8080可通过docker run -e覆盖;建议集中定义,便于维护
EXPOSE声明容器暴露的端口(仅 “声明”,不实际映射)EXPOSE 8080仅用于说明镜像的端口用途,实际映射需靠docker run -p
CMD容器启动时执行的命令(可被docker run后的参数覆盖)CMD ["python", "app.py"]推荐用 JSON 数组格式;一个 Dockerfile 仅最后一个CMD生效
ENTRYPOINT容器启动的 “入口命令”(不可被覆盖,仅可追加参数)ENTRYPOINT ["python", "app.py"]结合CMD可实现 “默认参数”(如ENTRYPOINT ["nginx"] + CMD ["-g", "daemon off;"]
VOLUME声明容器的匿名卷(避免容器数据丢失)VOLUME ["/usr/app/logs"]运行时可通过-v绑定本地目录 / 卷,覆盖匿名卷
4.3 完整构建步骤(实战示例:Python Web 应用)
步骤 1:准备构建环境(构建上下文)

创建专属目录存放 Dockerfile 和应用文件,构建上下文是 Docker 构建时可访问的文件目录(不能引用外部文件):

# 1. 创建构建目录并进入 mkdir -p /opt/python-demo && cd /opt/python-demo # 2. 编写简单的Python应用文件(app.py) tee app.py <<-'EOF' from flask import Flask import os app = Flask(__name__) port = int(os.getenv("PORT", 8080)) @app.route('/') def hello(): return "Hello Docker! This is a custom image built by Dockerfile." if __name__ == '__main__': app.run(host='0.0.0.0', port=port) EOF # 3. (可选)创建.dockerignore文件,精简构建上下文 tee .dockerignore <<-'EOF' # 排除无关文件,减少构建体积 __pycache__/ *.pyc .git/ .venv/ EOF 
步骤 2:编写 Dockerfile

在构建目录下创建Dockerfile文件(文件名必须是Dockerfile,无后缀):

# 步骤1:指定基础镜像(Python 3.9轻量版) FROM python:3.9-alpine # 步骤2:设置工作目录 WORKDIR /usr/app # 步骤3:设置环境变量(避免Python输出缓冲,解决日志乱码) ENV PYTHONUNBUFFERED=1 PORT=8080 LANG=C.UTF-8 # 步骤4:安装依赖(Alpine系统用apk,合并RUN减少分层) RUN pip install flask --no-cache-dir # 步骤5:复制本地app.py到容器工作目录 COPY app.py . # 步骤6:声明暴露端口 EXPOSE 8080 # 步骤7:容器启动命令 CMD ["python", "app.py"] 
步骤 3:执行构建命令

核心语法:docker build [选项] <构建上下文路径>

# -t:给镜像打标签(格式:镜像名:版本),. 表示构建上下文为当前目录 docker build -t python-demo:v1 . 

构建成功会输出:

Successfully built xxxxxxxx(镜像ID) Successfully tagged python-demo:v1 
步骤 4:验证镜像并运行容器
# 1. 查看构建好的镜像 docker images | grep python-demo # 2. 运行镜像,映射8080端口,配置日志轮转 docker run -d -p 8080:8080 \ --name demo-app \ --log-opt max-size=50m \ --log-opt max-file=3 \ python-demo:v1 # 3. 验证容器运行结果 curl http://localhost:8080 # 预期输出:Hello Docker! This is a custom image built by Dockerfile. # 4. 查看容器日志(带时间戳) docker logs -t demo-app 
4.4 Dockerfile 构建优化技巧

新手易写出体积大、分层多的镜像,掌握以下技巧可大幅优化:

  1. 合并 RUN 指令:将多个RUN&&合并,减少镜像分层(如RUN apt update && apt install -y nginx && apt clean all);
  2. 使用轻量基础镜像:优先选择alpineslim版本(如nginx:alpinenginx体积小 90%);
  3. 清理缓存文件:安装依赖后清理包管理器缓存(如yum clean allapt cleanpip --no-cache-dir);
  4. 精简构建上下文:通过.dockerignore排除无关文件(如日志、缓存、源码管理目录);

多阶段构建(进阶):用于编译型语言(如 Go、Java),编译阶段用完整镜像,运行阶段用轻量镜像,示例:dockerfile

# 阶段1:编译Go程序 FROM golang:1.21 as builder WORKDIR /app COPY main.go . RUN go build -o myapp main.go # 阶段2:运行程序(仅复制编译结果) FROM alpine:3.18 COPY --from=builder /app/myapp /usr/bin/ CMD ["/usr/bin/myapp"] 
4.5 常见问题与解决
  1. 构建时报 “找不到文件”:检查COPY/ADD的源路径是否在构建上下文内(不能用../引用上下文外的文件);
  2. 镜像体积过大:检查是否未清理缓存、是否用了过重的基础镜像、是否复制了无关文件;
  3. 容器启动后立即退出:检查CMD/ENTRYPOINT指令是否正确(如命令执行完就退出,需确保进程前台运行,如nginx -g daemon off;);
  4. 权限问题:容器内文件权限不足时,可通过RUN chmod/RUN chown调整(如RUN chmod 755 /usr/app/app.py);
  5. 日志乱码:Dockerfile 中添加ENV LANG=C.UTF-8,统一编码。

四、查看 / 修改镜像 / 容器 / 卷默认路径(通用版)

Docker 的镜像、容器、卷共享同一个根存储目录,修改根目录即可统一调整所有数据的存储位置(包括日志文件)。

1. 查看默认路径(通用)

# 核心命令:查看Docker根存储目录 docker info | grep "Docker Root Dir" # 默认输出:Docker Root Dir: /var/lib/docker 

2. 修改默认路径(通用安全步骤)

步骤 1:停止 Docker 及相关服务
sudo systemctl stop docker sudo systemctl stop containerd 
步骤 2:迁移原有数据到新路径
# 示例:将默认路径/var/lib/docker迁移到新路径/data/docker # 1. 创建新目录(按需修改路径) sudo mkdir -p /data/docker # 2. 迁移数据(rsync保留权限和符号链接,避免Docker启动失败) sudo rsync -avz /var/lib/docker/ /data/docker/ 
步骤 3:配置新存储路径
# 编辑daemon.json,添加data-root参数(保留日志驱动配置) sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ], "log-driver": "local", "log-opts": { "max-size": "100m", "max-file": "5" }, "data-root": "/data/docker" # 核心:指定新的存储根目录 } EOF 
步骤 4:重启验证
# 重新加载配置并启动Docker sudo systemctl daemon-reload sudo systemctl start docker # 验证路径是否生效 docker info | grep "Docker Root Dir" # 预期输出:Docker Root Dir: /data/docker # 运行测试容器,确认新路径生成日志文件 docker run -d --name test-log hello-world ls -lh /data/docker/containers/ # 有新容器日志目录即为生效 
步骤 5:(可选)删除旧数据

确认新路径正常后,删除旧路径释放空间:

sudo rm -rf /var/lib/docker/ 

3. 注意事项(通用)

  1. 数据迁移必须用rsync(而非cp),保留文件权限和符号链接;
  2. 新路径的属主必须为root,权限为700sudo chmod 700 /data/docker);
  3. 若修改后 Docker 无法启动,删除daemon.json中的data-root行,恢复数据后重启即可;
  4. 日志文件会随根目录迁移,无需单独配置。

五、Docker 核心命令速查(通用)

操作类型核心命令
镜像操作拉取:docker pull 镜像名:标签 查看:docker images 删除:docker rmi 镜像ID
容器操作运行:docker run -d -p 端口映射 镜像名 查看运行中:docker ps 查看所有:docker ps -a 停止:docker stop 容器ID 删除:docker rm 容器ID
卷操作创建:docker volume create 卷名 查看:docker volume ls 删除:docker volume rm 卷名
日志操作查看:docker logs [容器名/ID] 实时查看:docker logs -f [容器名/ID] 查看日志路径:docker inspect --format='{{.LogPath}}' [容器名/ID]
镜像构建 / 推送构建:docker build -t 镜像名:标签 . 推送:docker push 镜像名:标签(需先登录仓库)
系统清理清理无用镜像 / 容器:docker system prune -a(谨慎执行,删除未使用资源) 清理日志:sudo find /var/lib/docker/containers/ -name "*.log" -type f -delete

总结

  1. 通用安装:分 apt/yum 体系,核心是安装docker-ce及配套组件,启动并设置开机自启;
  2. 镜像加速:通过daemon.json配置国内源,是提升拉取速度的核心优化;
  3. 核心使用
    • 镜像 / 容器 / 卷 / 日志默认存储在/var/lib/docker,文件映射优先用卷挂载;
    • 日志管理核心是docker logs命令,生产环境需配置max-size/max-file避免磁盘占满,推荐local日志驱动;
    • Dockerfile 构建镜像的核心是FROM为必填,指令按 “准备环境→安装依赖→复制文件→启动配置” 编写,优化重点是减少分层、精简体积,添加编码环境变量解决日志乱码;
  4. 路径修改:通过daemon.jsondata-root统一修改根存储目录,迁移数据需用rsync保留权限;
  5. 命令速查:掌握镜像、容器、卷、日志的基础操作命令,可高效管理 Docker 资源。

Read more

文件上传漏洞下(含原理拆解 + 实操细节 + 多服务器适配)

文件上传漏洞下(含原理拆解 + 实操细节 + 多服务器适配)

一、核心概述 本文是文件上传漏洞的进阶补充内容,在原有绕过方式基础上,新增00 截断、.htaccess 文件利用、多服务器解析漏洞、图片木马4 种核心攻击手段,详细拆解了每种方式的底层原理、分步实操流程、环境依赖及避坑要点;同时覆盖 Apache、IIS、Nginx 三大主流服务器的版本专属漏洞,补充多文件上传混淆、静态文件解析遗漏等边缘绕过思路,并完善了从目录权限控制到版本更新的全维度防护体系,形成 “原理 - 实操 - 适配 - 防护” 的完整知识闭环。 二、新增核心绕过方式(原理 + 实操 + 适配) (一)00 截断绕过(Windows + 低版本环境专属) 1. 底层原理 * 核心逻辑:%00是 ASCII 码中的空字符(NULL),在 C

By Ne0inhk
破局海量日志噪音:基于 Rust + DeepSeek 实现微服务级联故障的精准定位与自动化修复

破局海量日志噪音:基于 Rust + DeepSeek 实现微服务级联故障的精准定位与自动化修复

目录 * 摘要 * 第一章 系统背景与技术选型 * 1.1 运维可观测性的挑战 * 1.2 为什么选择 Rust * 1.3 为什么选择 DeepSeek V3.2 * 第二章 环境准备与基础设施搭建 * 2.1 模型服务接入 * 2.2 Rust 项目初始化 * 2.3 依赖管理与生态集成 * 第三章 核心架构设计与模块实现 * 3.1 模块化设计理念 * 3.2 主程序控制流 (main.rs) * 3.3 异常检测引擎 (anomaly_detector.rs) * 3.4 诊断引擎与报告生成 (diagnostic_engine.

By Ne0inhk

Windows/Linux双平台保姆教程:用DDNS-GO v6.7.6实现免费内网穿透(替代花生壳)

从零构建你的专属动态域名服务:告别付费内网穿透,拥抱开源DDNS-GO 最近和几个独立开发者朋友聊天,大家普遍吐槽的一个点就是内网穿透服务。无论是为了远程调试家里的NAS,还是想临时给客户演示一个部署在本地开发机的Web应用,传统的方案要么像花生壳这类工具需要付费且流量受限,要么配置复杂得让人望而却步。更别提一些云服务商提供的穿透服务,按流量计费的模式对于高频测试来说,成本完全不可控。其实,如果你手头有一个公网IP(哪怕是动态变化的),或者你的IPv6环境是通畅的,完全没必要依赖第三方付费服务。今天,我们就来深入聊聊如何利用一个名为 DDNS-GO 的开源神器,亲手搭建一套稳定、免费且完全自控的动态域名解析系统,彻底摆脱对商业内网穿透工具的依赖。 DDNS-GO 的核心价值在于它的“桥梁”作用。它持续监测你本地网络的公网IP地址(包括IPv4和IPv6),一旦发现IP发生变化,就立刻调用云解析服务商(如阿里云、腾讯云DNSPod、Cloudflare等)的API,自动将你指定的域名更新解析到新的IP上。这样一来,无论你的网络环境如何变动,通过一个固定的域名,你总能从外网访问到家里的

By Ne0inhk
Flutter 组件 dart_dev 适配鸿蒙 HarmonyOS 实战:效能基座方案,构建全生命周期自动化开发流水线与研发套件治理架构

Flutter 组件 dart_dev 适配鸿蒙 HarmonyOS 实战:效能基座方案,构建全生命周期自动化开发流水线与研发套件治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 dart_dev 适配鸿蒙 HarmonyOS 实战:效能基座方案,构建全生命周期自动化开发流水线与研发套件治理架构 前言 在鸿蒙(OpenHarmony)生态迈向大规模工业化协同、涉及海量跨端功能并发验证及严苛代码交付质量标准的背景下,如何实现研发流程的“机器化”约束,已成为决定团队产出稳定性与效能上限的关键。在鸿蒙设备这类强调 AOT 极致性能与多包(HAP/HSP)协同部署的环境下,如果研发环节依然依赖分散的散装脚本或非标的 Git 工作流,由于由于环境配置的微差异,极易由于由于“本地通过,远端爆炸”导致集成交付效率的高频损耗。 我们需要一种能够统一任务调度(Task Runner)、支持全量规范校验且具备“一站式”研发脚本治理能力的基座方案。 dart_dev 为 Flutter 开发者引入了“研发即代码(Dev-as-Code)

By Ne0inhk