Docker镜像定制与Yum仓库配置实战:从环境固化到服务部署
你肯定遇到过这样的场景本地开发环境一切正常代码跑得飞快可一旦部署到服务器上各种依赖缺失、版本冲突、环境变量不对的问题就接踵而至。更头疼的是当你想在服务器上装个新软件比如配置一个 Yum 仓库却发现系统版本、网络策略、权限问题层层阻碍一个简单的yum install命令背后可能是一整天的折腾。Docker 的出现本质上就是为了解决这种“在我机器上好好的”的困境。但很多人对 Docker 的理解还停留在“一个能跑应用的盒子”这个层面。他们会用docker run拉取一个现成的镜像却对如何从零开始定制一个符合自己需求的镜像感到无从下手他们知道容器里可以装软件却不知道如何高效、可复用地为容器配置软件源比如 Yum 仓库。这篇文章我们不谈那些宏大的概念就从两个最具体、也最能体现 Docker 核心价值的场景切入如何从零定制一个简单的 Docker 镜像以及如何在容器内部署服务时优雅地配置 Yum 仓库。你会发现真正用好 Docker不在于记住多少命令而在于理解它如何将一次性的、手工的环境配置沉淀为一份可版本化、可分发、可复现的“环境说明书”。1. 从“跑起来”到“定下来”理解 Docker 镜像的真正价值很多人学习 Docker 的第一步是docker pull一个现成的镜像然后docker run启动它。这没错但这只是消费 Docker而不是运用 Docker。Docker 镜像的核心价值在于“固化环境”。想象一下你为项目写了一份详细的《环境配置手册》里面记录了需要安装的所有软件、依赖版本、配置文件。新同事入职照着手册一步步操作依然可能因为系统差异、网络问题而失败。而 Docker 镜像就是这份手册的“可执行版本”。它不仅仅记录了需要什么更直接打包了一个完整的、隔离的、已经配置好的文件系统。docker run这个动作就是瞬间复制并启动了这个文件系统。所以定制镜像不是为了炫技而是为了将你手动配置环境的“隐性知识”和“手工操作”变成一份显性的、可自动化执行的资产。无论是为了团队协作还是为了将来自己快速重建环境这都至关重要。1.1 定制镜像的起点Dockerfile 不是脚本是蓝图定制镜像的关键是Dockerfile。请不要把它看作一个顺序执行的安装脚本而应视为一份构建蓝图。它声明了从一个基础环境如centos:7开始到最终目标镜像中间需要经历的所有“图层”变更。一个最常见的误区是把 Dockerfile 写得像在虚拟机里手动操作一样下载、解压、安装、配置环境变量、清理。虽然功能上可能实现但会制造出臃肿、低效的镜像。Docker 镜像由只读层Layer叠加而成Dockerfile 的每一条指令如RUN,COPY,ADD都会创建一个新的层。层越多镜像越大构建和分发越慢。一个高效的定制思路是合并同类项清理无用项。例如不要写成RUN yum install -y wget RUN wget -O /tmp/pkg.tar.gz http://example.com/pkg.tar.gz RUN tar -zxf /tmp/pkg.tar.gz -C /opt RUN rm -f /tmp/pkg.tar.gz RUN yum clean all而应该尽量合并RUN指令并在同一层内完成下载、安装和清理RUN yum install -y wget \ wget -O /tmp/pkg.tar.gz http://example.com/pkg.tar.gz \ tar -zxf /tmp/pkg.tar.gz -C /opt \ rm -f /tmp/pkg.tar.gz \ yum clean all这样五个层合并为一层不仅减少了镜像层数也避免了中间临时文件残留到镜像中因为rm操作和文件创建在同一层。1.2 实战构建一个包含 Python 3 和 pip 的 CentOS 基础镜像让我们从一个最简单的需求开始基于官方 CentOS 7 镜像定制一个包含 Python 3 和 pip 的环境。这是很多 Python 应用的基础。首先创建一个目录比如my-python-centos并在其中创建Dockerfile文件。# 1. 指定基础镜像。这是蓝图的起点。 FROM centos:7 # 2. 维护者信息可选但建议保留 LABEL maintaineryour-emailexample.com # 3. 设置构建时的环境变量方便后续指令引用 ENV PYTHON_VERSION3.9.16 \ PIP_VERSION22.3.1 # 4. 核心安装依赖和 Python。 # 注意CentOS 7 默认的 yum 源里没有 python3需要先安装 EPEL 扩展源。 RUN yum install -y epel-release \ yum install -y python3 python3-pip \ yum clean all \ rm -rf /var/cache/yum/* # 5. 验证安装并升级 pip 到指定版本可选 RUN python3 --version \ pip3 --version \ pip3 install --upgrade pip${PIP_VERSION} # 6. 设置工作目录。后续的 COPY 或 RUN 命令默认在此目录下执行。 WORKDIR /app # 7. 声明容器运行时监听的端口只是一个声明方便使用者知道 # EXPOSE 80 # 8. 设置容器启动时默认执行的命令 # 这里我们只是启动一个 bash shell方便交互式检查。 CMD [/bin/bash]现在在Dockerfile所在目录执行构建命令docker build -t my-python-centos:1.0 .-t指定镜像名称和标签。.表示构建上下文是当前目录Docker 引擎会把这个目录下的文件发送给 Docker daemon。构建成功后运行它docker run -it --rm my-python-centos:1.0进入容器后输入python3和pip3 list验证环境。关键理解这个简单的Dockerfile已经体现了几个最佳实践明确的基础镜像FROM centos:7可复现。合并 RUN 指令安装软件和清理缓存一气呵成。使用环境变量便于管理和修改版本。清理构建缓存yum clean all和删除缓存目录减小镜像体积。设置工作目录让容器内的路径更清晰。2. 容器内的“软件商店”配置 Yum 仓库的艺术在容器内安装软件最直接的想法是进入容器后yum install。但你会发现很多官方基础镜像为了保持精简移除了默认的 Yum 仓库配置或者仓库地址不可达特别是在隔离的网络环境或需要加速的国内环境。这时为容器配置 Yum 仓库就成了必须掌握的技能。配置 Yum 仓库有两种根本性的思路对应着 Docker 使用的两个不同阶段构建时Build Time和运行时Run Time。2.1 构建时配置将仓库信息固化到镜像中这是最推荐、最标准的做法。你的应用需要什么软件应该在构建镜像时就通过Dockerfile的RUN指令安装好。相应的配置 Yum 仓库也应该在Dockerfile中完成。具体做法是将仓库的.repo文件复制到容器内的/etc/yum.repos.d/目录。示例为 CentOS 7 镜像添加阿里云镜像源首先在宿主机上准备一个阿里云的 CentOS 7 仓库文件例如aliyun-centos7.repo[base] nameCentOS-$releasever - Base - mirrors.aliyun.com baseurlhttp://mirrors.aliyun.com/centos/$releasever/os/$basearch/ gpgcheck1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [updates] nameCentOS-$releasever - Updates - mirrors.aliyun.com baseurlhttp://mirrors.aliyun.com/centos/$releasever/updates/$basearch/ gpgcheck1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [extras] nameCentOS-$releasever - Extras - mirrors.aliyun.com baseurlhttp://mirrors.aliyun.com/centos/$releasever/extras/$basearch/ gpgcheck1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7修改Dockerfile在安装软件之前先COPY这个文件FROM centos:7 LABEL maintaineryour-emailexample.com # 复制宿主机上的仓库配置文件到镜像内 COPY aliyun-centos7.repo /etc/yum.repos.d/ # 可以清空或备份原有的低效仓库文件可选 RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 现在安装软件就会使用阿里云源了 RUN yum install -y epel-release \ yum install -y python3 python3-pip wget vim \ yum clean all WORKDIR /app CMD [/bin/bash]这样做的好处镜像一旦构建完成无论被分发到世界哪个角落只要运行起来其内部的 Yum 仓库配置就是确定且高效的。这完全符合 Docker“一次构建到处运行”的理念。2.2 运行时配置动态挂载仓库文件适用于调试与特殊场景有时你只是临时进入一个基础容器进行调试需要快速安装一些工具如net-tools,telnet,lsof但又不想为此专门构建一个新镜像。这时可以在运行容器时将宿主机上配置好的.repo文件挂载到容器内。# 假设宿主机上已有配置好的 my-local.repo 文件 docker run -it --rm \ -v /path/to/your/my-local.repo:/etc/yum.repos.d/my-local.repo:ro \ centos:7 \ /bin/bash-v参数将宿主机的文件挂载到容器内ro表示只读防止容器内误操作修改宿主机文件。进入容器后你就可以使用这个自定义仓库安装软件了。重要警告这只是一种临时、便捷的调试手段绝不应该用于生产环境。因为破坏了可移植性镜像的运行依赖于宿主机上的特定文件。不可复现其他人无法通过你的镜像复现完全相同的环境。存在安全风险挂载的仓库源如果不可信可能引入风险。因此记住一个原则所有为满足应用运行所必需的软件和环境配置都应尽可能在Dockerfile中完成。运行时挂载仅用于数据、配置文件和日志等动态内容。3. 在容器内安装与部署服务以 Nginx 为例掌握了镜像定制和仓库配置我们就可以在容器内完整地部署一个服务了。以部署 Nginx 为例我们将串联起前面的所有知识。目标构建一个包含 Nginx 的镜像并确保它能够运行。3.1 编写 Dockerfile# 使用我们之前定制好的、带有阿里云源的基础镜像效率更高 # 当然直接从 centos:7 开始也可以。 FROM my-python-centos:1.0 LABEL maintaineryour-emailexample.com LABEL descriptionA custom image with Nginx installed. # 1. 安装 Nginx # 注意CentOS 7 基础 yum 源里没有 nginx需要先安装 EPEL 源或配置 Nginx 官方源。 # 我们的基础镜像已安装 EPEL所以可以直接安装。 RUN yum install -y nginx \ yum clean all \ rm -rf /var/cache/yum/* # 2. 创建必要的目录如果不存在 RUN mkdir -p /var/www/html # 3. 复制自定义的 Nginx 配置文件可选 # 假设宿主机当前目录下有一个 nginx.conf COPY nginx.conf /etc/nginx/nginx.conf # 4. 复制网站静态文件可选 COPY ./html /var/www/html/ # 5. 暴露端口 EXPOSE 80 EXPOSE 443 # 6. 设置容器启动命令 # 以前台方式启动 Nginx这样容器才不会退出 CMD [nginx, -g, daemon off;]3.2 准备配置文件与静态文件nginx.conf: 可以根据需要自定义一个最简单的示例如下user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/conf.d/*.conf; server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html; index index.html index.htm; location / { try_files $uri $uri/ 404; } } }./html/index.html: 一个简单的 HTML 文件用于测试。3.3 构建并运行# 构建镜像 docker build -t my-nginx:1.0 . # 运行容器 # -p 80:80 将宿主机的80端口映射到容器的80端口 # -d 后台运行 docker run -d --name my-nginx-container -p 80:80 my-nginx:1.0现在访问宿主机的 IP 地址你应该能看到 Nginx 的欢迎页面或你自定义的 HTML 内容。3.4 关键点解析为什么是daemon off;这是容器内运行服务类应用如 Nginx, Apache, Redis的一个核心技巧。在 Linux 系统中服务通常以守护进程daemon模式运行即后台运行。但 Docker 容器的设计哲学是容器内前台运行的进程的生命周期就是容器的生命周期。如果 Nginx 以默认的守护进程模式启动它会在启动后立即转入后台Docker 会认为这个启动它的进程nginx命令已经结束于是容器就会自动退出。通过nginx -g daemon off;参数我们强制 Nginx 在前台运行这样它就会一直占据前台进程容器也就保持运行状态。对于其他服务原理类似Redis:redis-server --daemonize noApache httpd: 需要在配置文件中设置Foreground为 true或使用httpd -D FOREGROUND4. 从单次成功到持续可靠镜像优化与部署 checklist当你成功运行起第一个自定义服务的容器时这只是起点。要将其用于开发、测试乃至生产环境还需要考虑更多。4.1 镜像优化进阶建议使用更小的基础镜像centos:7镜像大约 200MB。对于生产环境可以考虑alpine~5MB或debian:bullseye-slim~80MB等更精简的镜像。这能极大提升镜像拉取和部署速度。FROM alpine:latest RUN apk add --no-cache nginx多阶段构建Multi-stage Build适用于需要编译的应用如 Go, Java。在一个阶段FROM中编译在另一个干净的阶段中只复制编译好的二进制文件丢弃庞大的编译环境和中间文件最终镜像非常小。合理利用.dockerignore文件类似于.gitignore它可以指定在构建时忽略哪些文件和目录避免将不必要的文件如本地日志、node_modules、.git目录发送到 Docker 守护进程加速构建过程。固定软件版本在Dockerfile中尽量使用明确的版本号如python3-3.9.16而不是python3。这能确保每次构建的环境完全一致避免因依赖自动升级导致的不兼容问题。4.2 容器部署简易 Checklist在将你的自定义镜像投入使用时可以按以下清单检查[ ]镜像来源是否从可信的仓库拉取或基于可信的基础镜像构建[ ]端口映射-p参数是否正确宿主机端口是否被占用[ ]数据持久化应用产生的数据如数据库文件、上传内容、日志是否需要持久化是否通过-v挂载了宿主机目录或 Docker Volume[ ]资源限制是否需要通过--memory,--cpus限制容器的 CPU 和内存使用[ ]网络模式默认的bridge模式是否满足需求是否需要host网络或自定义网络[ ]容器命名是否使用--name为容器指定了有意义的名称方便管理[ ]重启策略是否通过--restart设置了容器退出时的重启策略如always,unless-stopped[ ]环境变量敏感配置如密码、密钥是否通过-e传入环境变量而非写死在镜像或代码中[ ]日志查看是否知道如何通过docker logs container_name查看容器日志来排查问题4.3 当容器内服务无法启动基础排查路径即使按照教程操作你也可能遇到容器启动后服务没跑起来的情况。不要慌按以下顺序排查检查容器状态docker ps -a查看容器状态。如果是Exited说明启动后立即退出了。查看容器日志docker logs container_name是首要工具。这里通常会直接打印出服务启动失败的错误信息如配置文件语法错误、端口被占用、权限不足。进入容器检查如果容器是Up状态但服务不可用可以docker exec -it container_name /bin/bash进入容器内部。检查服务进程ps aux | grep nginx检查配置文件cat /etc/nginx/nginx.conf手动尝试启动服务看是否有报错。检查端口映射docker port container_name确认端口映射是否正确。检查宿主机防火墙/SELinux有时宿主机防火墙或 SELinux 会阻止对映射端口的访问。回归最小化测试暂时去掉所有自定义配置COPY配置文件步骤使用镜像默认配置启动看基础服务是否能跑通。如果能再逐一添加自定义配置定位问题点。定制 Docker 镜像和在容器内部署服务远不止是学会几条命令。它代表了一种工作模式的转变从手工的、易出错的环境搭建转向声明式的、可版本化的环境管理。当你通过一个几十行的Dockerfile就能在任何地方复现一个完全相同的复杂应用环境时你才能真正体会到容器化技术带来的确定性和效率提升。从今天起尝试为你下一个项目写一个Dockerfile这比任何理论都更能让你理解它的价值。

相关新闻

终极指南:OpenRPA开源RPA工具零基础到精通实战教程

终极指南:OpenRPA开源RPA工具零基础到精通实战教程

终极指南:OpenRPA开源RPA工具零基础到精通实战教程 【免费下载链接】openrpa Free Open Source Enterprise Grade RPA 项目地址: https://gitcode.com/gh_mirrors/op/openrpa 还在为重复性的电脑操作烦恼吗?🤔 每天花几个小时在Excel、…

2026/10/15 3:34:45 阅读更多 →
使用Docker镜像高效编译Apache Doris并解决虚拟机磁盘扩容问题

使用Docker镜像高效编译Apache Doris并解决虚拟机磁盘扩容问题

如果你正在寻找一种能快速搭建 Doris 编译环境、避免手动安装复杂依赖,并且希望编译产物能稳定保留的方法,那么 Apache Doris 官方提供的 Docker 编译镜像绝对是你的首选。这个由社区维护的镜像,预装了编译 Doris 所需的所有工具链(如 LDB Toolchain)、第三方库和 JDK,让…

2026/10/10 4:06:15 阅读更多 →
轻量化AI工具1949 AI:提升日常生产力的技术解析

轻量化AI工具1949 AI:提升日常生产力的技术解析

1. 项目概述:当轻量化AI遇上日常生产力在AI技术日益普及的今天,我们正经历着从"大模型崇拜"到"实用主义落地"的转变。1949 AI这款轻量化智能工具的出现,恰好击中了当前AI应用领域的几个关键痛点:传统AI解决方…

2026/10/7 11:14:29 阅读更多 →

最新新闻

WorkBuddy_AI Harness架构解析8_执行沙箱

WorkBuddy_AI Harness架构解析8_执行沙箱

执行沙箱 摘要 在现代软件系统尤其是 AI Agent、CI/CD 平台、在线代码评测系统以及低代码平台中,"让不可信代码或命令安全运行"是一个绕不开的核心问题。本文以 Harness 为例,深入剖析一个执行沙箱(Execution Sandbox)应…

2026/10/15 3:34:41 阅读更多 →
PHP音乐分享系统源码深度解析:从本地部署到音频全栈处理

PHP音乐分享系统源码深度解析:从本地部署到音频全栈处理

简介:这是一套基于ASP.NET开发的原创音乐分享平台完整源码,面向Web开发者与创业团队,用于快速搭建在线音乐社区、原创音乐推广站或伴奏资源分发网站。系统采用Web 2.0架构,集成用户中心、音乐上传发布、日志相册、资讯管理及原创音…

2026/10/15 3:34:41 阅读更多 →
在浏览器中零代码训练机器学习模型:Teachable Machine v1 开发指南与源码剖析

在浏览器中零代码训练机器学习模型:Teachable Machine v1 开发指南与源码剖析

AI 应用机器学习计算机视觉前端 【免费下载链接】teachable-machine-v1 Explore how machine learning works, live in the browser. No coding required. 项目地址: https://gitcode.com/gh_mirrors/te/teachable-machine-v1 点击查看 免费下载 本篇技术指南以仓库…

2026/10/15 3:34:41 阅读更多 →
仓颉 std.net SocketAddress 类详解:协议无关 Socket 地址的抽象基类与实战用法

仓颉 std.net SocketAddress 类详解:协议无关 Socket 地址的抽象基类与实战用法

人工智能AI 技能文档开发工具 【免费下载链接】DocAgent 项目地址: https://gitcode.com/Cangjie-SIG/DocAgent 点击查看 免费下载 SocketAddress 是仓颉标准库 std.net 包中表示协议无关 Socket 地址的抽象基类,它为 TCP、UDP、Unix Domain Socket 等所…

2026/10/15 3:34:41 阅读更多 →
StreamCap 多平台直播流自动录制客户端:功能特性、源码运行与容器化部署实战指南

StreamCap 多平台直播流自动录制客户端:功能特性、源码运行与容器化部署实战指南

音视频桌面应用直播 【免费下载链接】StreamCap Multi-Platform Live Stream Automatic Recording Tool | 多平台直播流自动录制客户端 基于FFmpeg 支持监控/定时/转码 项目地址: https://gitcode.com/gh_mirrors/st/StreamCap 点击查看 免费下载 StreamCap 是一…

2026/10/15 3:34:41 阅读更多 →
Java接入个人微信API:消息回调进客服系统的正确姿势

Java接入个人微信API:消息回调进客服系统的正确姿势

Java 团队接个人微信,通常第一反应是:Spring Boot 写个 Controller,接收回调,然后直接在方法里写业务。 本地调试挺顺,一上生产就出现:接口超时、消息重复、Tomcat 线程打满。 问题不在 Java,而…

2026/10/15 3:33:41 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →