揭秘Docker ARG默认值覆盖机制:3步实现灵活镜像构建

第一章:Docker ARG 默认值覆盖机制概述

在 Docker 构建过程中,ARG 指令用于定义构建时的变量,允许用户在构建镜像时传入自定义值。这些变量可在 Dockerfile 中被引用,从而实现灵活配置。通过设置默认值,ARG 提供了良好的向后兼容性和构建可预测性。

ARG 的基本语法与默认值定义

使用 ARG 时,可通过等号指定默认值。若构建时未传递该参数,则使用默认值。
# 定义带有默认值的构建参数
ARG APP_ENV=production
ARG VERSION=1.0.0

# 在镜像中使用 ARG 值
ENV NODE_ENV=$APP_ENV
RUN echo "Building version $VERSION"
上述代码中,APP_ENV 默认为 production,VERSION 默认为 1.0.0。若在构建时未显式指定,将自动采用这些值。

构建时覆盖 ARG 值的方法

可以通过 --build-arg 参数在调用 docker build 时覆盖默认值。
  1. 执行以下命令以覆盖默认环境:
docker build \
  --build-arg APP_ENV=development \
  --build-arg VERSION=2.1.0 \
  -t myapp:latest .
此命令将 APP_ENV 设置为 development,并更新版本号为 2.1.0,最终影响镜像构建行为。

ARG 与 ENV 的关键区别

虽然两者均可设置变量,但作用阶段不同。下表说明其差异:
特性ARGENV
作用阶段仅构建时可用构建时和运行时均可用
镜像中是否保留否(除非传递给 ENV)是
默认值支持支持支持
正确理解 ARG 的覆盖机制有助于实现多环境构建策略,提升 CI/CD 流程的灵活性与可维护性。

第二章:理解 ARG 指令的核心原理与构建上下文

2.1 ARG 指令的语法结构与作用域解析

`ARG` 指令用于在构建镜像时定义可传递的构建参数,其语法结构简洁但作用域规则至关重要。基本语法如下:
ARG <name>[=<default value>]
该指令允许为 `` 指定默认值,若未提供则在构建时需显式传入。参数仅在定义之后的构建阶段生效,无法在 `FROM` 之前使用。
作用域范围
`ARG` 的作用域从定义处开始,至当前构建阶段结束。多阶段构建中,每个阶段需独立声明所需参数:
ARG VERSION=latest
FROM alpine:$VERSION
RUN echo "Building version $VERSION"

ARG MODE=dev
RUN set -eux; if [ "$MODE" = "prod" ]; then echo "Production mode"; fi
上述示例中,`VERSION` 可被第一个 `FROM` 使用,而 `MODE` 仅作用于后续命令。跨阶段不可共享,必须重新声明同名 `ARG` 才能访问。
构建时传参方式
通过 `--build-arg` 传入实际值,覆盖默认设置。未设默认值且未传参时,构建将失败。

2.2 构建参数与环境变量的本质区别

构建参数(Build Args)和环境变量(Environment Variables)虽都能向镜像注入值,但作用阶段与用途截然不同。构建参数仅在镜像构建期间有效,用于动态控制构建流程;而环境变量则在容器运行时生效,影响应用执行上下文。
生命周期差异
构建参数在 Dockerfile 的 BUILD 阶段可用,构建结束后即失效;环境变量则持久化到镜像中,容器启动后仍可访问。
ARG BUILD_VERSION=1.0
ENV APP_ENV=production
上述代码中,BUILD_VERSION 仅用于构建过程(如选择依赖版本),而 APP_ENV 将写入镜像配置,供运行时程序读取。
使用场景对比
  • 构建参数适用于 CI/CD 中动态传入版本号、构建标志等
  • 环境变量更适合配置数据库地址、日志级别等运行时设置
特性构建参数环境变量
可见性构建期间运行期间
持久性不保留保留在镜像中

2.3 默认值定义方式及其在 Dockerfile 中的位置约束

在 Dockerfile 中,环境变量的默认值通常通过 `ARG` 和 `ENV` 指令定义,二者在镜像构建中扮演不同角色且存在位置限制。
ARG 与 ENV 的语义差异
`ARG` 用于定义构建时参数,仅在构建阶段生效,可被 `docker build` 命令行覆盖。而 `ENV` 设置的环境变量会持久化到运行容器中。
ARG VERSION=1.0
ENV APP_ENV=production
上述代码中,`VERSION` 可在构建过程中作为变量引用,若未指定则使用默认值 `1.0`;`APP_ENV` 则直接写入镜像,影响容器运行时环境。
指令位置约束
`ARG` 必须位于其被引用的指令之前,且在 `FROM` 之前或同阶段内有效。跨阶段构建中,每个 `FROM` 需重新声明所需 `ARG`。
  • ARG 在 FROM 前声明时,仅对后续 FROM 生效
  • ENV 可出现在任意位置,但仅对后续指令生效

2.4 构建时上下文传递机制深入剖析

在现代构建系统中,上下文传递是实现模块间依赖解析与配置共享的核心机制。构建上下文通常包含环境变量、编译参数、源码路径及依赖图谱等元数据,通过统一的数据结构贯穿整个构建流程。
上下文数据结构设计
典型的构建上下文以键值对形式组织,支持嵌套扩展:
type BuildContext struct {
    Env        map[string]string // 环境变量
    SourceDir  string            // 源码根目录
    OutputDir  string            // 输出目录
    Dependencies []string        // 依赖模块列表
    Metadata   map[string]interface{} // 自定义元数据
}
该结构体在初始化阶段填充,在各构建阶段间以引用方式传递,避免频繁拷贝带来的性能损耗。
传递机制实现方式
  • 函数参数显式传递:保证上下文可见性与可测试性
  • 线程局部存储(TLS):适用于异步并发场景下的上下文一致性维护
  • 依赖注入容器:通过注册-获取模式解耦组件对上下文的直接依赖

2.5 实践:通过 docker build 验证 ARG 值注入行为

在 Docker 构建过程中,`ARG` 指令用于定义可传递的构建参数,其值可在构建时动态注入。通过实践可明确其作用时机与可见范围。
构建参数定义示例
ARG BUILD_ENV=production
ARG VERSION
RUN echo "Build environment: $BUILD_ENV" && echo "Version: $VERSION"
上述代码中,`BUILD_ENV` 设有默认值,而 `VERSION` 无默认值,需在构建时提供。若未传入,其值为空字符串。
构建命令传参方式
使用如下命令进行构建:
  1. docker build --build-arg BUILD_ENV=staging --build-arg VERSION=1.2.3 -t myapp .
此时,Docker 将参数注入镜像构建上下文,`RUN` 指令可读取其值。
参数可见性规则
阶段是否可见
ARG 定义前否
后续指令(如 RUN)是
`ARG` 仅对后续指令可见,且不会保留于最终镜像中,确保敏感信息不被泄露。

第三章:默认值覆盖的触发条件与优先级规则

3.1 构建参数传入方式:--build-arg 的使用场景

在 Docker 镜像构建过程中,常需动态注入变量值。`--build-arg` 允许在构建时传入参数,提升镜像的灵活性与复用性。
基本语法与使用示例
ARG HTTP_PROXY
ARG VERSION=latest
RUN echo "Using version: $VERSION"
上述代码声明了两个构建参数:`HTTP_PROXY`(无默认值)和 `VERSION`(默认为 latest)。构建时可通过 `--build-arg` 覆盖。
构建命令示例
docker build --build-arg VERSION=v1.2.0 --build-arg HTTP_PROXY=http://proxy.example.com .
该命令将 `VERSION` 设为 `v1.2.0`,并设置代理地址,适用于不同网络环境下的定制化构建。
典型应用场景
  • 设置软件版本号,实现多版本镜像构建
  • 配置私有仓库或代理地址,适配企业内网
  • 控制构建阶段的行为开关,如是否启用调试模式

3.2 覆盖行为的合法性验证与类型匹配要求

在方法覆盖过程中,子类对父类方法的重写必须遵循严格的合法性验证规则。首要条件是方法签名的一致性,包括名称、参数列表和返回类型的协变规则。
类型匹配的核心原则
  • 访问修饰符不能比父类方法更严格
  • 异常声明不能扩大父类方法抛出的检查异常范围
  • 返回类型必须是原返回类型的子类或相同类型(协变返回)
代码示例与分析

@Override
public Number getValue() {
    return Integer.valueOf(42);
}
上述代码中,getValue 方法从父类返回 Number,子类以 Integer 覆盖,符合协变返回类型规则。JVM 在字节码验证阶段会检查该继承关系是否合法。
编译期校验流程
方法签名匹配 → 返回类型兼容性检查 → 异常类型约束验证 → 访问级别合规性判断

3.3 实践:动态切换构建配置实现多环境适配

在现代应用开发中,多环境(如开发、测试、生产)的构建适配是提升交付效率的关键。通过动态切换构建配置,可实现一套代码在不同环境中自动适配服务地址、日志级别等参数。
使用环境变量注入配置
构建时通过环境变量传入配置标识,结合配置文件动态加载对应内容:

{
  "development": {
    "apiUrl": "https://dev.api.com",
    "debug": true
  },
  "production": {
    "apiUrl": "https://api.com",
    "debug": false
  }
}
该 JSON 配置文件根据 NODE_ENV 环境变量决定加载哪个节点,实现无代码变更的环境切换。
构建脚本中的动态加载逻辑
  • 读取 NODE_ENV 变量值,默认为 development
  • 加载对应配置对象并注入全局常量
  • 打包时仅包含目标环境所需资源
此机制显著降低配置错误风险,提升构建可维护性。

第四章:灵活构建策略的设计与工程实践

4.1 多阶段构建中 ARG 的继承与重定义

在多阶段构建中,`ARG` 指令用于定义可传递的构建参数。这些参数在不同构建阶段之间具有特定的继承行为。
ARG 的作用域与继承规则
`ARG` 在首次定义的阶段及其后续指令中有效,但不会自动跨阶段继承。若要在后续阶段使用,必须重新声明。
ARG VERSION=1.0
FROM alpine AS builder
ARG VERSION
RUN echo $VERSION

FROM alpine AS runtime
ARG VERSION
RUN echo $VERSION || echo "default"
上述代码中,`VERSION` 在每个阶段都需重新声明 `ARG` 才能访问。尽管第一阶段继承了全局 `ARG`,第二阶段仍需显式声明以恢复该变量。
重定义与优先级
可通过构建时传参(--build-arg)覆盖默认值。若某阶段重新定义同名 `ARG`,则以当前阶段赋值为准,体现局部优先原则。

4.2 结合 CI/CD 流水线实现参数化镜像构建

在现代 DevOps 实践中,将镜像构建过程与 CI/CD 流水线集成是提升交付效率的关键。通过引入参数化构建机制,可以在不同环境或分支场景下动态生成定制化镜像。
参数化构建的核心优势
  • 支持多环境(如 dev、staging、prod)差异化构建
  • 提升构建脚本复用性,降低维护成本
  • 结合 Git Tag 或分支名称自动推导镜像标签
GitLab CI 示例配置

build-image:
  stage: build
  script:
    - docker build --build-arg ENV=$CI_ENVIRONMENT_NAME -t myapp:$CI_COMMIT_REF_SLUG .
    - docker push myapp:$CI_COMMIT_REF_SLUG
  variables:
    DOCKER_BUILD_ARGS: "--build-arg ENV=$CI_ENVIRONMENT_NAME"
上述配置利用 docker build --build-arg 将 CI 环境变量传递至 Dockerfile,实现运行时参数注入。其中 $CI_COMMIT_REF_SLUG 自动映射分支名,确保镜像标签唯一性。
构建流程可视化
[CI 触发] → [参数解析] → [Docker 构建] → [镜像推送] → [部署就绪]

4.3 使用 .env 文件管理构建参数的最佳实践

在现代应用开发中,使用 `.env` 文件集中管理构建参数已成为标准做法。它不仅提升了配置的可维护性,还增强了环境间的隔离性。
基础结构与语法规范

# .env
APP_NAME=MyApp
BUILD_ENV=production
API_TIMEOUT=5000
上述配置定义了应用名称、构建环境和接口超时时间。等号两侧不应有空格,注释以 # 开头,仅在行首有效。
安全与部署建议
  • 将 .env 加入 .gitignore,避免敏感信息泄露
  • 使用 .env.example 提供模板,指导团队成员配置本地环境
  • 生产环境中应通过 CI/CD 注入真实值,而非直接提交文件
多环境配置策略
文件名用途
.env.development开发环境参数
.env.staging预发环境配置
.env.production生产环境专属设置

4.4 实践:构建轻量级调试镜像与生产镜像

在容器化应用部署中,区分调试镜像与生产镜像是优化安全性与可维护性的关键实践。调试镜像需包含诊断工具,而生产镜像应尽可能精简。
多阶段构建策略
使用 Docker 多阶段构建,可从同一基础代码生成不同用途的镜像:
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

FROM alpine:latest AS debug
RUN apk add --no-cache curl strace
COPY --from=builder /app/myapp .
CMD ["./myapp"]

FROM scratch AS production
COPY --from=builder /app/myapp .
CMD ["/myapp"]
该配置中,`debug` 阶段引入网络和追踪工具便于问题排查;`production` 阶段基于 `scratch` 构建,仅保留二进制文件,显著减小攻击面与镜像体积。
镜像特性对比
维度调试镜像生产镜像
基础镜像alpinescratch
体积~15MB~5MB
工具支持包含诊断命令无额外工具

第五章:总结与进阶学习建议

构建可复用的自动化部署流程
在实际项目中,持续集成和部署(CI/CD)是提升交付效率的关键。以下是一个基于 GitHub Actions 的 Golang 服务自动构建与部署示例:

name: Deploy Service
on:
  push:
    branches: [ main ]
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: '1.21'
      - name: Build binary
        run: go build -o myapp .
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v0.1
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USER }}
          key: ${{ secrets.KEY }}
          script: |
            sudo systemctl stop myapp
            cp myapp /opt/myapp/
            sudo systemctl start myapp
推荐的学习路径与资源组合
  • 深入理解分布式系统设计,建议阅读《Designing Data-Intensive Applications》
  • 掌握 Kubernetes 编排,可通过官方文档完成 Pod、Service、Ingress 实战配置
  • 提升性能调优能力,使用 pprof 分析 Go 程序内存与 CPU 使用情况
  • 参与开源项目如 Prometheus 或 Etcd,了解工业级代码结构与协作流程
监控与可观测性实践
工具用途集成方式
Prometheus指标采集暴露 /metrics 接口并配置 scrape
Loki日志聚合搭配 Promtail 收集容器日志
Jaeger链路追踪注入 OpenTelemetry SDK 到微服务
【深度强化学习】(2) Double DQN 模型解析,附Pytorch完整代码 Double DQN 算法是 DQN 算法的改进版本,解决了 DQN 算法过估计行为价值的问题。Double DQN 算法不直接通过最大化的方式选取目标网络计算的所有可能 Q 值,而是首先通过估计网络选取最大 Q 值对应的动作。在 Double DQN 框架中存在两个神经网络模型,分别是训练网络与目标网络。这两个神经网络模型的结构完全相同,但是权重参数不同;每训练一段之间后,训练网络的权重参数才会复制给目标网络。 阅读详情

相关推荐

Fluent UDF实战:除了速度入口,你的DEFINE_PROFILE宏还能搞定这些边界条件(温度、组分、壁面接触角全解析)

本文深入解析Fluent UDF中DEFINE_PROFILE宏在复杂边界条件中的高阶应用,涵盖温度场、组分浓度和壁面接触角等关键场景。通过实战代码示例,展示如何实现空间梯度温度场、动态组分控制和接触角动态调整,助力CFD工程师突破标准界面限制,提升仿真精度和效率。

weixin_28688385的博客 449

揭秘Docker ARG默认值被覆盖的真相:3种场景还原与最佳实践方案

掌握Docker ARG 的默认值覆盖机制,避免构建参数失效。详解本地构建、CI/CD流水线和多阶段镜像3种场景,揭示ARG与ENV交互逻辑,提供可复用的最佳实践方案,提升镜像构建灵活性与可控性,值得收藏。

BytePerch的博客 714

雷达气象学(8)——反射率因子图实战(强对流预警篇)

本文聚焦雷达反射率因子图在强对流预警中的实战应用,深入解析了柱状回波、有界弱回波区(BWER)、三体散射(TBSS)等关键回波结构特征,这些是识别超级单体风暴和大冰雹的核心“身份证”。文章强调从静态识别转向动态追踪与多源数据综合研判的思维转变,并提供了系统的实战分析流程与常见误区避坑指南,旨在提升对强对流天气的短临预警能力。

weixin_29213827的博客 485

揭秘Docker ARG变量传递机制:如何在多阶段构建中精准控制参数?

掌握Docker ARG 的构建阶段传递技巧,解决多阶段构建中参数共享难题。适用于镜像优化与环境隔离场景,通过正确声明与传递ARG变量,实现构建过程精准控制,提升灵活性与复用性,值得收藏。

FuncLens的博客 913

R语言 地理加权随机森林(GWRFC )

随机森林可以产生高准确度的分类器,被广泛用于解决模式识别问题。然而,随机森林赋予每个决策树相同的权重,这在一定程度上降低了整个分类器的性能。该算法引入二次训练过程,提高分类正确率高目前,鲜有中文文章介绍GWRFC的技术文档,作者想使用该方法时会遇到重重困难,因此有必要利用R来建模,通过流程演示,供读者参阅。............

qingchen98的博客 6629

【WorkBuddy专栏39】零基础也能做小程序——WorkBuddy微信小程序开发完全指南

【WorkBuddy专栏39】零基础也能做小程序——WorkBuddy微信小程序开发完全指南

AI人人懂 3145

揭秘Docker构建变量机制:ARG和ENV的5大关键差异

掌握Docker镜像构建ARG与ENV区别,轻松管理构建参数与运行环境。本文详解两者在作用域、生命周期、适用场景等方面五大关键差异,帮助开发者精准配置变量。理解ARG传参灵活性与ENV持久性优势,提升镜像构建效率,值得收藏。

DeepLens的博客 763

C#实现图片裁剪 (附完整源码)

C#实现图片裁剪 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 505

揭秘Docker ARG构建阶段传递:90%开发者忽略的关键细节

掌握Docker ARG构建阶段传递技巧,解决多阶段构建中参数无法传递的痛点。详解ARG与ENV配合使用方法,适用于定制化镜像构建场景,提升灵活性与安全性。关键细节解析,值得收藏。

DebugLoom的博客 1043

VTK在QT与非QT环境下使用的区别

VTK可以在QT框架内使用,也可以独立于QT使用,这两种使用方式在架构、交互和渲染方面有显著差异。

深之JohnChen的专栏 628

2026全网最新华为OD机试真题目录A+B+C+D+E卷(持续收录中)-Python版

🔔本文收录于「最新最全华为OD机试真题(Python版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!本人所写题库均精心搜集于互联网。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!

**My Coding Family** 10万+

揭秘Docker多阶段构建:如何用ARG实现环境变量精准传递

掌握Docker多阶段构建中ARG环境变量传递技巧,解决跨阶段变量共享难题。详解ARG在不同构建阶段的声明与使用方法,提升镜像构建灵活性与可维护性,适用于CI/CD等场景。揭秘Docker ARG 构建阶段传递机制,值得收藏。

ProceChat的博客 720

为什么 ChatGPT 生成的下载地址会长成 sky-metal-cards-jerry.quirkypony34.chatgpt.site 这种奇怪的样子

我今天看到的这条地址,确实很容易让人产生一种感觉,ChatGPT 明明只是生成了几张 PNG 图片和一个压缩包,为什么最终拿到的却不是类似这种看起来很正规的下载链接,而是一长串带有、UUID、apidecks的地址。更容易让人疑惑的是,其中还出现了一个平时很少见到的域名。这并不是浏览器随机生成的临时 URL,也不是某个来历不明的第三方文件服务器。根据 OpenAI 在 2026 年公布的 ChatGPT Sites 文档和相关服务条款,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 59

【Docker-Day 7】揭秘 Dockerfile 启动指令:CMD、ENTRYPOINT、ENV、ARG 与 EXPOSE 详解

本文将深入探讨 Dockerfile 的另一半核心内容——启动与配置指令。我们将详细剖析 `CMD` 与 `ENTRYPOINT` 的爱恨情仇,揭示它们如何共同决定容器的启动行为;辨析 `ENV` 与 `ARG` 在构建时与运行时传递变量的异同;并阐明 `EXPOSE` 的声明作用以及 `.dockerignore` 文件在优化构建过程中的重要性。学完本章,你将能够构建出配置更灵活、行为更可控、镜像更精简的专业级 Docker 镜像。

吴师兄大模型的博客 1741

NTscan扫描工具

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

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Docker多阶段构建+--build=完美组合?(揭秘高阶开发者的构建策略)

掌握高效构建之道,详解Docker多阶段构建与Docker Compose up --build的协同优势,适用于微服务部署与持续集成场景。通过分层优化提升构建速度,减少镜像体积,显著增强开发效率,值得收藏。

LogicShoal的博客 857

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

揭秘Docker环境下AI模型版本控制难题:3步实现无缝回滚与追踪

解决AI模型版本混乱难题,详解Docker的AI模型版本管理方案。适用于多环境部署与团队协作,通过镜像标签、元数据注释和CI/CD流水线,实现3步回滚与全程追踪,提升开发效率与稳定性,值得收藏。

LearnFlow的博客 879

揭秘Docker Build缓存无效化根源:5步精准定位并修复缓存穿透问题

掌握Docker镜像构建缓存无效化技巧,有效提升构建效率。通过分析层变更、文件变动、指令顺序等5个关键点,精准定位缓存穿透根源,适用于CI/CD、多环境部署场景。方法实用、效果显著,值得收藏。

FastProceed的博客 869

Docker镜像权限控制终极方案:USER、GID、capabilities协同配置揭秘

掌握Docker镜像权限控制精髓,解决容器安全运行难题。通过合理配置USER切换、GID隔离与Linux capabilities,实现最小权限原则,适用于多租户部署与生产环境。显著提升安全性与合规性,避免特权滥用。方法实用,配置清晰,值得收藏。

LiteCode的博客 936

揭秘PHP容器中环境变量的致命陷阱:90%开发者都忽略的3个细节

掌握PHP容器化环境中环境变量的正确使用方法,避开配置失效、变量覆盖与加载顺序三大陷阱。适用于Docker部署、CI/CD流程与多环境适配场景,提升应用稳定性与安全性。90%开发者忽视的关键细节,值得收藏。

VarFun的博客 1080

FoundryVTT Docker:如何用容器化技术重塑虚拟桌面游戏服务器?

在当今云原生技术蓬勃发展的时代,容器化部署已成为现代应用交付的标准范式。FoundryVTT Docker项目正是这一趋势下的杰出实践,它将流行的Foundry Virtual Tabletop(虚拟桌面平台)封装为可移植、可扩展的Docker容器,为角色扮演游戏爱好者和技术运维人员提供了前所未有的部署便利性。这个开源项目不仅简化了复杂的游戏服务器配置流程,还通过容器化的隔离性、可重复性和资源控制

gitblog_00544的博客 324

【Docker-Day 10】容器的“持久化”记忆:深入解析 Docker 数据卷 (Volume)

在前面的文章中,我们已经掌握了如何构建镜像和管理容器的生命周期。然而,一个关键问题随之而来:容器是“无状态”且“短暂”的,当容器被删除后,我们在其中产生的所有数据都将灰飞烟灭。这对于需要持久化存储数据的应用(如数据库、日志文件、用户上传内容等)是不可接受的。本文将深入探讨 Docker 的核心概念之一——数据卷 (Volume),它正是为了解决这一难题而生。我们将从数据丢失的根源讲起,详细解析数据卷的原理、核心操作,并通过丰富的实战案例,带你彻底掌握如何为容器提供“持久化”的记忆,确保数据安全无忧。

吴师兄大模型的博客 1566

【Docker-Day 28】K8s 核心配置管理:解密 ConfigMap,告别硬编码!

在云原生应用开发中,将配置硬编码到镜像中是一种常见的反模式,它严重降低了应用的灵活性和可移植性。每次环境配置变更(如数据库地址、API 密钥或功能开关)都意味着重新构建和部署镜像,这不仅效率低下,也增加了出错的风险。Kubernetes 提供了 `ConfigMap` 这一核心资源,旨在彻底解决此问题。本文将深入探讨 ConfigMap 的概念、创建方式及其在 Pod 中的两种核心使用方法——环境变量注入和数据卷挂载,帮助您优雅地实现配置与应用镜像的解耦,提升部署效率和应用的可维护性。

吴师兄大模型的博客 957

3步轻松修复损坏视频:开源工具Untrunc的完整使用指南

你是否曾经历过这样的场景?精心拍摄的婚礼视频突然无法播放,重要的会议录像在关键时刻卡住,或者珍贵的家庭回忆视频莫名其妙地损坏。面对这些损坏的MP4、MOV、M4V视频文件,你是否感到束手无策?今天我要为你介绍一款神奇的开源视频修复工具——Untrunc,它能让你轻松恢复那些看似无法挽救的视频文件。 ## 为什么你的视频会损坏?常见原因深度解析 在数字时代,视频文件损坏已经成为普遍现象。根据统计

gitblog_00815的博客 420

【Docker-Day 13】超越默认Bridge:精通Docker Host、None与自定义网络模式

在上一篇 **【Docker-Day 12】** 中,我们深入探索了 Docker 默认的 `bridge` 网络模式,理解了其通过网络地址转换(NAT)和端口映射实现容器与外界通信的原理。然而,`bridge` 模式并非万能钥匙,不同的应用场景对网络性能、隔离性和管理性有着截然不同的需求。本文作为 Docker 网络世界的下篇,将带你解锁另外三种关键的网络模式:`host`、`none`,以及强烈推荐在生产环境中使用的**自定义 `bridge` 网络**。我们将通过详尽的原理剖析、实战演练和场景对比,助

吴师兄大模型的博客 1369

PyTorch-CUDA镜像自定义扩展指南:添加你的专属依赖

本文介绍如何基于官方PyTorch-CUDA镜像,通过Dockerfile扩展自定义依赖,实现深度学习环境的统一与可复现。涵盖依赖管理、私有包安装、构建优化及部署实践,解决环境不一致问题,提升AI项目开发效率与协作能力。

weixin_35019679的博客 368

【Docker-Day 31】告别手动创建 PV!一文搞懂 Kubernetes StorageClass 工作原理与实战

本文将深入探讨 Kubernetes 存储体系中的一个关键角色——`StorageClass`,它实现了存储资源的“动态供给”(Dynamic Provisioning)。我们将从其核心概念、工作原理解析入手,通过详尽的 YAML 字段说明和实战演练,带你彻底掌握如何利用 `StorageClass` 自动化创建和管理存储资源,让你的 K8s 集群存储管理能力迈上一个新台阶。

吴师兄大模型的博客 904
上一篇: 你真的会用blkio权重吗?详解Docker容器IO资源管理核心参数
下一篇: 端口冲突总找不到原因?,一文掌握Docker容器端口冲突精准检测术
普通网友
博客等级 码龄3年 606粉丝 2892原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值