Docker多阶段构建文件复制陷阱(90%开发者都踩过的坑)

第一章:Docker多阶段构建文件复制陷阱(90%开发者都踩过的坑)

在使用Docker多阶段构建时,开发者常通过 COPY --from=stage_name 从前一阶段复制文件。然而,一个看似简单的操作却隐藏着常见的陷阱:复制路径错误、源阶段命名冲突、以及忽略隐式文件。

错误的源阶段引用

当未正确指定源构建阶段名称或索引时,Docker会抛出“no stage found”错误。确保每个阶段都有明确的 AS 命名:
# 正确命名构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY main.go .
RUN go build -o server main.go

# 引用命名阶段
FROM alpine:latest AS runtime
WORKDIR /root/
# 确保 --from 指向正确的阶段名
COPY --from=builder /app/server .

忽略隐藏文件导致运行失败

某些应用依赖隐藏配置文件(如 .env 或 .config),若复制时未显式包含,会导致容器启动异常。
  • 使用通配符复制时需注意隐藏文件不会被自动包含
  • 建议分别复制显式和隐藏文件,或使用脚本预处理

目录结构错位引发权限问题

复制文件时若目标路径不存在,Docker不会自动创建父目录,导致构建失败。
错误示例正确做法
COPY --from=builder /app/config/.env /etc/app/.env
RUN mkdir -p /etc/app
COPY --from=builder /app/config/.env /etc/app/.env

第二章:多阶段构建的核心机制与常见误区

2.1 多阶段构建的基本原理与优势

多阶段构建(Multi-stage Build)是 Docker 提供的一种优化镜像构建流程的技术,允许在一个 Dockerfile 中使用多个 FROM 指令,每个阶段可独立运行,最终仅保留必要的产物。
构建阶段分离
通过将编译与运行环境分离,可显著减小最终镜像体积。例如:
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/myapp .
CMD ["./myapp"]
第一阶段使用 Go 编译器生成二进制文件,第二阶段仅复制可执行文件至轻量 Alpine 镜像,避免携带编译工具链。
核心优势
  • 减小镜像体积,提升部署效率
  • 增强安全性,减少攻击面
  • 提升构建复用性,便于维护
该机制特别适用于需要编译语言(如 Go、Rust、C++)的生产环境镜像构建。

2.2 构建阶段间文件隔离的本质解析

在多阶段构建中,文件隔离是通过容器镜像层的不可变性与构建上下文边界实现的。每个构建阶段独立运行于各自的临时容器中,仅当显式使用 COPY --from=stage_name 时,才能访问前一阶段的产物。
隔离机制的核心原理
  • 各阶段拥有独立的文件系统视图
  • 中间层镜像默认不保留文件残留
  • 通过命名阶段(AS stage-name)实现精准引用
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp main.go

FROM alpine:latest  
COPY --from=builder /app/myapp /usr/local/bin/myapp
上述代码中,第一阶段生成可执行文件,第二阶段仅复制该文件,其余源码、依赖均被隔离。参数 --from=builder 明确指定来源阶段,确保最小化最终镜像体积并提升安全性。

2.3 COPY指令在多阶段中的作用域分析

在Docker多阶段构建中,COPY指令的作用域严格限定于当前构建阶段。它无法跨阶段直接访问其他阶段的文件系统内容,必须通过--from参数显式引用前一阶段的命名镜像。
跨阶段文件复制语法
FROM golang:1.21 AS builder
WORKDIR /app
COPY main.go .
RUN go build -o main

FROM alpine:latest AS runner
WORKDIR /root/
COPY --from=builder /app/main .
上述代码中,第二阶段通过--from=builder从名为builder的阶段复制可执行文件,实现构建产物的精准迁移。
作用域限制与优化策略
  • COPY仅能访问本阶段上下文及通过--from导入的内容
  • 未指定--from时,默认从构建上下文主机目录复制文件
  • 合理划分阶段可显著减小最终镜像体积

2.4 典型错误案例:跨阶段文件访问失败还原

在CI/CD流水线中,跨阶段文件访问失败是常见痛点。典型场景为构建阶段生成的产物未正确传递至部署阶段,导致任务中断。
问题根源分析
  • 阶段间存储隔离:各阶段运行于独立容器,临时文件无法持久化
  • 路径配置错误:硬编码本地路径,未使用工件仓库统一管理
  • 权限不足:文件上传或下载时缺乏相应凭据
解决方案示例
artifacts:
  paths:
    - ./dist/
  expire_in: 7 days
上述GitLab CI配置将./dist/目录标记为工件,自动上传至共享存储,供后续阶段拉取。参数expire_in设置保留周期,避免空间滥用。 通过引入标准化工件机制,实现跨阶段数据可靠传递。

2.5 构建上下文与临时层对复制行为的影响

在容器镜像构建过程中,构建上下文和临时中间层对文件复制行为有显著影响。Dockerfile 中的 COPY 指令依赖于构建上下文的路径范围,无法访问其外的文件。
构建上下文的作用域
构建上下文是发送到 Docker 守护进程的文件集合,决定了可被复制的源路径:
COPY ./app.js /usr/src/app/
若 app.js 不在上下文目录内,该指令将失败。
临时层的缓存机制
每条指令生成临时中间层,影响后续复制效率:
  • 缓存命中时跳过复制,提升构建速度
  • 上下文变更导致缓存失效,重新执行 COPY
多阶段构建中的复制优化
通过临时层分离构建环境,精确控制最终镜像内容:
FROM golang:1.21 AS builder
COPY . /go/src/myapp/
RUN go build -o myapp

FROM alpine:latest
COPY --from=builder /go/src/myapp/myapp /bin/myapp
--from=builder 显式指定源层,仅复制必要产物,减少镜像体积。

第三章:文件复制的关键语法与最佳实践

3.1 正确使用COPY --from实现跨阶段复制

在多阶段构建中,COPY --from 指令允许从一个构建阶段复制文件到另一个阶段,有效减少最终镜像体积。
跨阶段复制的基本语法
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
RUN chmod +x myapp
上述代码中,--from=builder 指定源阶段名称,仅将编译后的二进制文件复制到轻量基础镜像中,避免携带构建工具。
优势与最佳实践
  • 显著减小镜像大小,提升部署效率
  • 支持按需复制,避免冗余文件注入运行环境
  • 可跨命名阶段复制,增强构建逻辑组织性

3.2 源路径与目标路径的精确控制技巧

在文件同步与数据迁移场景中,精确控制源路径与目标路径是确保操作准确性的关键。合理配置路径规则可避免误覆盖、权限错误等问题。
路径映射策略
常见的路径控制方式包括绝对路径绑定、相对路径重定向和通配符匹配。使用配置文件定义映射关系可提升可维护性。
配置示例与分析

{
  "source": "/data/project/v1/**",
  "destination": "/backup/v1/",
  "exclude": ["/data/project/v1/temp/*"]
}
上述配置表示将源路径下所有文件同步至目标目录,但排除临时文件。其中 ** 匹配任意层级子目录,exclude 明确指定忽略规则。
常用通配符说明
  • *:匹配单层目录中的任意文件名
  • **:递归匹配多级子目录
  • ?:匹配单个字符

3.3 避免冗余文件拷贝的精简策略

在构建高性能数据处理系统时,减少不必要的文件拷贝是提升效率的关键。通过优化数据流转路径,可显著降低I/O开销。
使用符号链接替代物理复制
对于跨目录共享文件的场景,采用符号链接能避免重复存储:
ln -s /path/to/original/file.dat /path/to/destination/file.dat
该命令创建指向原始文件的软链接,节省磁盘空间并保持数据一致性。
基于哈希校验的去重机制
在拷贝前计算文件哈希值,仅当内容变更时执行写入操作:
  • 使用SHA-256算法生成唯一指纹
  • 缓存历史哈希值用于比对
  • 差异检测后触发增量同步
结合内存映射(mmap)技术,进一步减少用户态与内核态间的数据复制次数,实现高效传输。

第四章:典型陷阱场景与解决方案

4.1 忘记指定--from导致镜像膨胀

在构建 Docker 镜像时,若未明确指定 --from 阶段名称,多阶段构建可能失效,导致不必要的文件被复制到最终镜像中,显著增加镜像体积。
常见错误示例
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

FROM alpine:latest
COPY . /app/  # 错误:未使用 --from=builder
上述代码中,COPY . /app/ 默认从本地上下文复制所有文件,而非从 builder 阶段。这不仅绕过了编译产物的精确控制,还引入了源码、依赖文件等冗余内容。
正确用法
应显式指定来源阶段:
COPY --from=builder /app/myapp /usr/local/bin/myapp
该指令仅复制可执行文件,避免携带编译环境和源码,使最终镜像更小、更安全。
  • 镜像体积可减少 80% 以上
  • 提升启动速度与安全性
  • 符合最小权限原则

4.2 误用相对路径引发的文件缺失问题

在多环境部署中,使用相对路径读取配置或资源文件极易导致运行时错误。当工作目录发生变化时,原本预期可访问的文件将无法定位。
典型错误示例

import json
with open('./config/settings.json', 'r') as f:
    config = json.load(f)
上述代码在开发环境中正常运行,但在生产环境中因启动路径不同,会抛出 FileNotFoundError。
解决方案对比
方法稳定性适用场景
相对路径低临时脚本
绝对路径中固定部署环境
基于 __file__ 动态构建高跨平台项目
推荐采用动态路径构建方式,确保路径解析与脚本位置一致。

4.3 构建缓存干扰下的复制一致性故障

在分布式系统中,缓存层与数据库的异步复制可能导致数据不一致。当多个节点同时读写缓存与后端存储时,网络延迟或节点故障会加剧状态分歧。
典型故障场景
  • 缓存更新成功但数据库写入延迟
  • 主从复制滞后导致旧值被重新加载到缓存
  • 故障转移后新主节点未同步最新缓存状态
代码示例:非原子更新操作
// 先更新数据库,再删除缓存(存在窗口期)
func UpdateUser(id int, name string) error {
    if err := db.Exec("UPDATE users SET name=? WHERE id=?", name, id); err != nil {
        return err
    }
    cache.Delete("user:" + strconv.Itoa(id)) // 可能失败
    return nil
}
该逻辑在数据库更新后删除缓存,若在此期间有读请求,可能将旧值重新载入缓存,形成脏数据。
一致性策略对比
策略优点风险
Cache-Aside实现简单读取时可能加载过期数据
Write-Through写操作一致性高性能开销大

4.4 多阶段依赖混乱导致的构建失败

在多阶段构建中,若未明确各阶段的依赖边界,极易引发构建失败。例如,某阶段错误引用了后续阶段才生成的构件,将导致编译中断。
典型错误示例
FROM golang:1.20 AS builder
COPY . /app
RUN go build -o myapp main.go

FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/  # 正确引用
COPY --from=nonexistent-stage /config.yaml /etc/config.yaml  # 错误:阶段不存在
上述代码中,第二阶段试图从一个未定义的构建阶段复制文件,Docker 构建引擎将报错并终止流程。
依赖管理建议
  • 明确划分构建阶段职责,如:编译、测试、打包
  • 使用语义化命名替代默认索引(如AS builder)
  • 通过docker build --target验证各阶段可独立执行

第五章:总结与高效构建的最佳建议

持续集成中的自动化测试策略
在现代软件交付流程中,自动化测试是保障质量的核心环节。通过在 CI/CD 流程中嵌入单元测试、集成测试和端到端测试,可以显著降低发布风险。

// 示例:Go 语言中的单元测试
func TestCalculateTax(t *testing.T) {
    input := 1000.0
    expected := 120.0
    result := CalculateTax(input)
    if result != expected {
        t.Errorf("Expected %f, got %f", expected, result)
    }
}
依赖管理的最佳实践
使用版本锁定机制(如 go.sum 或 package-lock.json)确保构建可重现。避免在生产环境中使用浮动版本依赖。
  • 定期更新依赖并进行安全扫描
  • 使用私有包代理提升下载稳定性
  • 实施依赖审查流程,防止引入高危组件
容器化构建的性能优化
多阶段构建能有效减少最终镜像体积并提升安全性。以下为 Docker 构建优化示例:
优化项说明
分层缓存将不变的依赖安装放在上层,利用缓存加速构建
最小基础镜像使用 alpine 或 distroless 镜像减少攻击面

源码提交 → 静态检查 → 单元测试 → 构建镜像 → 安全扫描 → 推送仓库 → 部署预发

基于DPCNN实现电商情感分析任务 下载链接项目中使用的模型是DPCNN,在模型中我们定义了三个组件,分别是embedding层,卷积层和全连接层。Embedding层:将每个词生成对应的嵌入向量,就是利用一个连续型向量来表示每个词卷积层:提取语句中的语义信息Linear层:将结果映射成2大小用于二分类,即正反面的概率。 阅读详情

相关推荐

手把手教你用QEMU虚拟化华为路由器固件(附完整网络配置指南)

本文提供了一份详尽的QEMU虚拟化华为路由器固件的实战指南。从固件解包、网络桥接配置到QEMU虚拟机启动,手把手教你搭建完整的嵌入式设备沙箱环境,特别适合安全研究、逆向分析和学习嵌入式系统工作原理。

tgb3456789的博客 937

Docker镜像构建太慢?试试--from的跨阶段复制神技!

Docker镜像构建太慢?试试多阶段构建的跨阶段复制技巧。通过Docker多阶段构建的--from参数,精准复制所需文件,减少冗余层,显著提升构建效率。适用于微服务、CI/CD等场景,节省时间和资源,值得收藏。

InstrWander的博客 666

无人机避障——卡内基梅隆大学(CMU)CERLAB 无人机自主框架复现

CMUCERLAB无人机自主框架是一个模块化的无人机自主导航系统,包含感知、测绘、规划和控制等组件。安装过程中遇到的主要问题包括:(1)cv_bridge路径未正确识别,需手动指定路径;(2)OpenCV版本冲突(4.2与4.6),导致动态导航节点崩溃。解决方案包括:完全卸载OpenCV4.2,重新编译安装OpenCV4.6,并修改相关CMakeLists文件指定版本。最终成功运行仿真环境,实现无人机在Gazebo和RViz中的自主避障导航功能。

weixin_45390670的博客 1645

Docker Compose构建陷阱全曝光:你不可不知的--build 8个隐藏行为

揭秘Docker Compose up --build的8个隐藏行为,避开构建失败与镜像污染陷阱。涵盖开发环境部署、缓存机制、多服务构建顺序等关键场景,解析自动重建触发条件与强制重建技巧,提升容器编排效率。开发者必读,值得收藏。

VarChat的博客 705

国产信创服务器软硬件兼容情况1 --- ARM架构

信创,即信息技术应用创新产业,它是数据安全、网络安全的基础,也是新基建的重要组成部分...

一只猿的自我修养 4741

局部路径规划算法 - B样条曲线(B-spline Curves)

本文详解了B样条以及代码实现

BigDavid123的博客 6506

Docker镜像设计陷阱曝光:90%开发者忽略的3个分层误区

揭秘Docker镜像设计常见误区,深入解析Docker镜像分层原理与优化策略,帮助开发者提升构建效率、减少镜像体积。涵盖多阶段构建、层合并与缓存机制,适用于微服务与CI/CD场景,显著提升部署性能,值得收藏。

Instrulink的博客 714

「大模型学习」(11)kv cache与vllm详解,一文读懂!

Key(键):表示上下文的特征。Value(值):表示上下文的内容。Query(查询):表示当前 token 的查询向量。AttentionQKVsoftmaxQKTdkVAttentionQKVsoftmaxdk​​QKT​V),每次生成一个新 token(比如下一个词),模型会再次查看之前的所有K和V,以计算当前 token 的注意力。问题:每次都重新计算之前的 K/V 很浪费!项目维度(简化)含义Q当前 token 的查询向量。

qq_43044037的博客 5405

为什么90%的开发者在Docker部署LangChain时踩坑?真相在这里

掌握Docker-LangChain的正确部署方法,解决依赖冲突与镜像构建难题。本部署文档覆盖主流应用场景,提供精简镜像配置与自动化启动方案,提升部署效率90%。避坑指南+实战脚本,值得收藏

ByteGlow的博客 629

SuperMap iObjects Java组件开发——环境部署(IntelliJ IDEA)

SuperMap iObjects Java 是面向GIS应用系统开发者的组件式GIS开发平台,具有强大的地理数据管理、编辑、显示、分析等功能,并且其具有极强的易用性和丰富的帮助资源,适宜快速开发大型GIS应用系统。本文将介绍如何在IntelliJ IDEA集成开发环境中进行SuperMap iObjects Java组件的环境部署。

nan620403的博客 1081

【红外DDE算法】一种应用于高动态范围红外可视化的算法

【红外DDE算法】一种应用于高动态范围红外可视化的算法 - 这个算法背后的动机 - 展示这个算法的流程 - 然后讨论各个可调参数的意义。

sunwindl91181的博客 1682

Docker部署Java应用常见陷阱,90%开发者都踩过的坑你中了几个?

解决Java应用Docker部署难题,避开常见陷阱。涵盖镜像优化、JVM调参、容器资源限制等核心方法,适用于微服务与生产环境。提升稳定性与性能,90%开发者都忽略的关键细节,值得收藏。

StepNexus的博客 617

工业仪表读数识别:YOLO目标检测 + OCR混合方案实战

仪表整体(meter):粗定位整只仪表,用于快速裁剪、排除背景干扰表盘区域(dial):精确的圆形/方形表盘区域,用于后续矫正和读数数字区域(display)/指针(pointer):数显表定位数码管区域,指针表可辅助定位指针为什么要分三级?因为现场仪表安装角度、距离、光照差异极大。先粗检再精检,比一步到位的准确率高很多,也方便后续做透视变换。工业仪表读数识别,技术路线的选择比算法精度更重要。选对了路线,事半功倍;选错了,怎么调都达不到验收标准。几条落地建议:指针表优先传统算法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 95

Docker+K8s+Python部署陷阱大盘点,90%开发者都踩过的坑你中了几个?

解决Python Kubernetes部署常见难题,本文盘点Docker+K8s协同部署的典型陷阱与最佳实践,涵盖镜像优化、配置管理、服务发现等关键环节,提升应用稳定性与交付效率。Python开发者必读,值得收藏

GatherTide的博客 792

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Docker实战黄金法则】:90%开发者忽略的6大基础陷阱

掌握Docker核心技巧,避开新手常犯的6大基础陷阱。本docker基础教程涵盖镜像管理、容器网络、数据卷配置等关键场景,揭示高效调试与资源优化方法。提升部署效率,避免常见错误,值得收藏。

VarIsle的博客 806

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

COPY指令背后的缓存逻辑,90%的开发者都理解错了,你中招了吗?

揭秘Docker镜像构建中COPY指令的缓存机制,避免重复构建提升效率。适用于CI/CD、多阶段构建等场景,通过合理规划文件拷贝顺序优化缓存命中率,显著加快构建速度。掌握这一细节,轻松提升Docker构建性能,值得收藏。

Instrulink的博客 734

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Docker镜像操作陷阱揭秘(90%开发者都用错了import和load)

掌握Docker镜像操作关键区别,避免常见误区。本文解析Docker镜像import与load的适用场景、核心命令及性能差异,揭示何时使用tar包导入或镜像加载,提升构建效率。搞懂原理少走弯路,值得收藏。

CompiShoal的博客 1004

【Docker镜像缓存失效终极指南】:揭秘90%开发者忽略的5大无效化陷阱

掌握Docker镜像缓存无效化的正确方法,避免构建效率下降。本文详解5大常见陷阱及应对策略,涵盖多阶段构建、文件变更顺序等典型场景,提升CI/CD流程稳定性。实用技巧值得收藏。

InstrGap的博客 1010

如何将Docker镜像缩小90%?99%开发者忽略的4个关键细节

掌握如何减小 docker 镜像文件体积,显著提升部署效率。本文揭示多阶段构建、精简基础镜像、清理冗余文件与合并图层4个关键细节,适用于微服务与CI/CD场景,助你轻松缩小镜像90%以上,值得收藏

LiteCompile的博客 394

10倍提速Docker Compose构建:缓存利用与多阶段构建实战指南

你是否还在忍受Docker Compose构建时漫长的等待?每次修改代码都要重新下载依赖、重新编译?本文将带你掌握两大核心优化技术——缓存分层与多阶段构建,让构建速度提升10倍以上,同时显著减小最终镜像体积。读完本文你将学会: - 如何科学设计Dockerfile充分利用构建缓存 - 多阶段构建的最佳实践与常见陷阱 - 在Compose中配置构建参数实现精细控制 - 通过案例对比优化前后的构建效...

gitblog_01103的博客 745

Docker - 构建多阶段镜像,大幅减小镜像体积

Docker多阶段构建优化Java应用镜像 摘要 本文介绍了Docker多阶段构建技术如何显著减小Java应用镜像体积。传统单阶段构建会将JDK、构建工具、测试代码等冗余文件全部打包进最终镜像,导致镜像臃肿。多阶段构建通过在同一个Dockerfile中定义多个独立构建阶段,仅将编译后的JAR文件等必要产物复制到最终镜像,实现构建环境与运行环境的彻底分离。 文章通过Spring Boot 3.2示例项目演示了: 构建阶段使用完整JDK和Maven编译代码 运行阶段仅基于轻量级JRE镜像 通过COPY --fr

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

Docker build缓存管理陷阱:90%开发者忽略的清理时机

掌握Docker镜像的缓存清理策略,有效避免构建效率下降与磁盘占用过高。适用于频繁构建场景,通过合理使用--no-cache、定期清理无用层及标记临时镜像,提升CI/CD流程稳定性。科学管理缓存,释放系统资源,值得收藏。

Instrulink的博客 933

Git工作树在Docker中的配置陷阱,90%开发者都忽略的4个关键细节

掌握Docker中Git工作树配置的4个关键细节,避免常见陷阱。适用于多环境部署与CI/CD流程,提升构建效率与一致性。通过合理挂载、忽略权限、精准同步与配置优化,确保容器内外协作无缝。Docker Git 工作树 配置实战经验分享,值得收藏。

LiteTrans的博客 706

Docker封装Python脚本的隐藏陷阱,1个标准模板避免90%常见错误

掌握python脚本封装成docker镜像最简Dockerfile,解决环境依赖与部署难题。适用于自动化任务、微服务等场景,基于多阶段构建精简镜像,提升安全性和启动效率。标准模板统一规范,避免常见错误,值得收藏。

QuickSolve的博客 617

Docker GenAI Stack配置陷阱,90%开发者忽略的3个致命漏洞

掌握Docker GenAI Stack的安全配置,避开90%开发者忽略的三大漏洞。涵盖AI应用部署中的权限隔离、镜像扫描与网络策略配置,提升系统安全性。实用方法+最佳实践,值得收藏

Instrustar的博客 993

为什么90%的多模态Agent项目在Docker依赖上踩坑?真相来了

掌握多模态 Agent 的 Docker 依赖管理,避免常见部署陷阱。本文剖析高频问题根源,涵盖环境隔离、镜像优化与跨平台适配方案,提升项目稳定性与交付效率。90%开发者忽略的关键实践,值得收藏。

ProceChat的博客 288
上一篇: 【Docker容器优雅关闭之谜】:深入解析SIGTERM信号处理机制
下一篇: Docker Compose命名卷配置全攻略:从入门到生产环境避坑(含实战案例)
SimProceed
博客等级 码龄1年 146粉丝 2011原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值