【微服务部署必看】:Docker Compose中depends_on陷阱与正确等待机制的6个实践案例

第一章:微服务部署中的启动顺序挑战

在现代云原生架构中,微服务之间通常存在复杂的依赖关系。当多个服务并行启动时,若未妥善处理依赖顺序,可能导致服务初始化失败或短暂不可用。例如,订单服务依赖用户服务提供的认证接口,若订单服务在用户服务尚未就绪时即开始健康检查,将触发熔断机制,影响整体系统稳定性。

常见依赖问题场景

  • 数据库连接服务未启动完成,导致其他服务连接超时
  • API网关在后端服务未注册前就开始路由流量
  • 消息队列消费者在Broker未就绪时尝试订阅

使用容器生命周期钩子控制启动顺序

Kubernetes 提供了 initContainers 和 livenessProbe 等机制来协调启动流程。以下是一个确保服务等待数据库可用的 initContainer 示例:
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  initContainers:
  - name: wait-for-db
    image: busybox
    command: ['sh', '-c', 'until nc -z db-service 5432; do echo "Waiting for DB..."; sleep 2; done;']
  containers:
  - name: app-container
    image: my-app:v1
    ports:
    - containerPort: 8080
上述配置中,wait-for-db 容器会持续探测 db-service 的 5432 端口,直到数据库服务响应为止,随后主应用容器才会启动。

服务健康状态检测对比

检测方式优点缺点
TCP 探活轻量、快速无法判断应用内部状态
HTTP GET 健康检查可验证业务逻辑就绪需实现健康端点
脚本轮询 + initContainer灵活控制依赖链增加启动时间
graph TD A[开始部署] --> B{依赖服务已就绪?} B -- 否 --> C[执行等待脚本] B -- 是 --> D[启动当前服务] C --> B D --> E[注册到服务发现] E --> F[对外提供服务]

第二章:Docker Compose中depends_on的真相与局限

2.1 理解depends_on的实际行为:容器启动 vs 服务就绪

在 Docker Compose 中,`depends_on` 常被误认为能确保服务“就绪”,但实际上它仅控制容器的**启动顺序**。这意味着,即使服务 A 依赖服务 B,`depends_on` 只保证 B 容器先于 A 启动,但不等待 B 的内部应用(如数据库进程)完成初始化。
典型误解示例
version: '3'
services:
  db:
    image: postgres:15
  web:
    image: my-web-app
    depends_on:
      - db
上述配置中,`web` 服务会在 `db` 容器启动后启动,但 PostgreSQL 可能尚未接受连接,导致应用启动失败。
解决方案对比
方法作用是否等待就绪
depends_on控制启动顺序否
healthcheck + wait-for script检测服务健康状态是
建议结合 `healthcheck` 与启动脚本,主动轮询依赖服务的可用性,以实现真正的“服务就绪”等待机制。

2.2 实践案例:数据库服务未就绪导致应用启动失败

在微服务架构中,应用启动时依赖的数据库服务可能因网络延迟或初始化耗时未能及时响应,导致连接超时或认证失败。
典型错误日志

ERROR: failed to connect to database: dial tcp 10.0.0.5:5432: connect: connection refused
该日志表明应用尝试连接 PostgreSQL 数据库时被拒绝,常见于数据库容器尚未完成启动。
解决方案:引入重试机制
使用带指数退避的重试逻辑,确保应用在数据库就绪前持续尝试连接:

backoff := time.Second
for i := 0; i < 5; i++ {
    db, err := sql.Open("pgx", dsn)
    if err == nil && db.Ping() == nil {
        return db
    }
    time.Sleep(backoff)
    backoff *= 2
}
代码通过最大5次重试、每次间隔翻倍的方式提升连接成功率,避免因短暂服务不可用导致启动失败。

2.3 深入分析:为什么depends_on不能保证依赖服务已准备好

Docker Compose 中的 `depends_on` 仅确保服务启动顺序,但不验证其内部是否已就绪。例如,数据库容器可能已启动,但 PostgreSQL 尚未完成初始化。
典型问题示例
version: '3.8'
services:
  db:
    image: postgres:13
    environment:
      POSTGRES_DB: myapp
  web:
    image: myapp/web
    depends_on:
      - db
该配置仅保证 `db` 容器先启动,但 `web` 服务仍可能在 `db` 完成监听前尝试连接,导致连接拒绝。
根本原因分析
  • depends_on 只等待容器进程启动,而非健康状态
  • 应用层服务需自行实现就绪检测机制
推荐解决方案
使用健康检查配合脚本重试机制:
方案说明
healthcheck定义容器健康状态判断逻辑
wait-for script在应用启动前主动探测依赖端口

2.4 对比实验:使用depends_on与不使用的启动结果差异

在 Docker Compose 中,depends_on 控制服务的启动顺序,但不影响应用层的就绪状态。通过对比实验可明确其实际影响。
配置示例
version: '3.8'
services:
  db:
    image: postgres:13
  web:
    image: my-web-app
    depends_on:
      - db
该配置确保 web 在 db 启动后再启动,但不保证数据库已完成初始化。
启动行为对比
场景是否使用 depends_on启动顺序保障应用连接成功率
无依赖声明否无序低(常因 DB 未就绪)
使用 depends_on是有序(仅进程启动)中(仍可能失败)
仅依赖 depends_on 不足以确保稳定性,需结合健康检查机制实现真正的依赖等待。

2.5 常见误区总结与规避策略

过度依赖自动重试机制
在分布式系统中,频繁使用无限制的重试策略可能导致雪崩效应。应结合指数退避与熔断机制控制请求频率。
// 使用带退避策略的重试逻辑
func retryWithBackoff(operation func() error, maxRetries int) error {
    for i := 0; i < maxRetries; i++ {
        if err := operation(); err == nil {
            return nil
        }
        time.Sleep(time.Second * time.Duration(1<
该函数通过左移运算实现指数级延迟,避免短时间内高频重试,提升系统稳定性。
忽视上下文超时传递
  • 未使用 context.WithTimeout 可能导致协程泄漏
  • 建议所有 RPC 调用显式设置超时阈值
  • 利用 context.Context 统一管理请求生命周期

第三章:构建可靠等待机制的核心原理

3.1 服务健康检查与就绪探针的设计原则

在构建高可用的微服务系统时,合理设计健康检查与就绪探针是保障服务稳定性的关键。探针应准确反映服务的真实状态,避免误判导致流量异常。
探针类型与适用场景
Kubernetes 提供三种探针:Liveness、Readiness 和 Startup。其中,Liveness 探针用于判断容器是否存活,若失败则触发重启;Readiness 探针决定 Pod 是否准备好接收流量。
livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5
上述配置中,initialDelaySeconds 避免启动期间误判,periodSeconds 控制检测频率。/health 应检查内部状态,/ready 则需验证依赖(如数据库、缓存)是否就绪。
设计最佳实践
  • 就绪探针不应包含自动恢复逻辑,仅反映当前服务能力
  • 避免将外部依赖的超时设置过短,防止级联故障
  • 生产环境建议结合指标监控动态调整探针参数

3.2 利用脚本实现智能等待:wait-for-it与自定义逻辑

在容器化应用启动过程中,服务间的依赖关系常导致时序问题。例如,应用容器可能早于数据库就绪,造成连接失败。为此,引入智能等待机制至关重要。
使用 wait-for-it.sh 实现依赖等待
./wait-for-it.sh db:5432 --timeout=60 --strict -- ./start-app.sh
该命令等待数据库 `db:5432` 可连接,最长60秒。`--strict` 确保若超时则脚本失败,避免应用在无依赖情况下启动。
自定义等待逻辑增强灵活性
对于复杂健康检查,可编写 Shell 脚本:
while ! curl -f http://api:8080/health; do
  sleep 2
done
此循环每2秒检测一次API健康端点,直到返回成功,适用于HTTP服务的深层就绪判断。
  • wait-for-it.sh 适用于TCP层等待,轻量且通用
  • 自定义脚本支持HTTP、gRPC等协议级检查
  • 结合Docker Compose的depends_on可实现更精确控制

3.3 实践案例:通过healthcheck协调微服务启动顺序

在微服务架构中,服务间依赖关系复杂,常需确保某些服务(如数据库或配置中心)先于其他服务启动。Docker Compose 支持通过健康检查(healthcheck)机制实现启动顺序编排。
定义健康检查
version: '3.8'
services:
  db:
    image: postgres:13
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5
上述配置中,`test` 指令周期性执行 `pg_isready` 验证数据库就绪状态;`interval` 控制检测频率;`retries` 定义失败重试次数,全部通过后容器状态变为 healthy。
依赖服务等待健康状态
  • 应用服务使用 depends_on 条件等待 db 达到健康状态
  • 结合脚本轮询 /health 端点,确保接口可用后再启动主进程
该机制避免了因依赖未就绪导致的启动失败,提升部署稳定性。

第四章:六种生产级等待机制的实践案例

4.1 案例一:基于wait-for-it.sh等待数据库就绪

在容器化应用部署中,服务依赖的启动时序问题尤为突出。例如,应用容器往往需要等待数据库完全就绪后才能正常启动。`wait-for-it.sh` 是一个轻量级的 Bash 脚本,用于在启动前检测目标主机和端口是否可达。
使用方式示例
#!/bin/bash
./wait-for-it.sh postgres:5432 --timeout=60 --strict -- ./start-app.sh
该命令表示:等待 `postgres:5432` 可连接,最长超时 60 秒,启用严格模式(若失败则退出),成功后执行 `start-app.sh`。参数说明: - `--timeout`:设置最大等待时间; - `--strict`:确保仅在目标可用时才运行后续命令; - `--` 后为待执行的主应用启动脚本。
优势与适用场景
  • 无需引入额外依赖,兼容性强;
  • 适用于 Docker Compose 环境中的服务编排;
  • 简化健康检查逻辑,提升容器启动可靠性。

4.2 案例二:使用dockerize实现多条件服务等待

在微服务架构中,容器启动顺序和依赖服务的就绪状态常引发问题。`dockerize` 是一个轻量级工具,可等待其他服务的端口开放或文件生成后再启动主进程。
核心功能与使用场景
`dockerize` 支持基于 TCP、HTTP 和文件的等待条件,适用于数据库、消息队列等依赖服务的健康检查。
dockerize -wait tcp://db:5432 -wait http://redis:6379/health -timeout 30s -- ./start-app.sh
上述命令表示:等待 PostgreSQL 的 5432 端口和 Redis 的 HTTP 健康接口均可用后,再执行启动脚本。`-timeout` 设置最大等待时间为 30 秒,避免无限阻塞。
  • -wait:指定依赖服务的检测地址,支持 tcp://、http://、https:// 和 file://
  • --:分隔符,其后为真正要执行的命令
  • -timeout:超时控制,防止因依赖故障导致容器持续挂起
通过组合多个 `-wait` 参数,可实现复杂的多条件同步机制,提升系统启动的可靠性。

4.3 案例三:集成curl健康检查确保API依赖可用

在微服务架构中,确保外部API依赖的可用性至关重要。通过在启动流程中嵌入 `curl` 健康检查,可有效避免因下游服务未就绪导致的故障。
健康检查脚本实现

#!/bin/bash
until curl -f http://api.dependency.service/health; do
  echo "等待依赖API启动..."
  sleep 5
done
echo "依赖服务已就绪"
该脚本利用 `curl -f`(--fail)选项在HTTP错误时返回非零状态码,循环重试直至服务响应成功。`sleep 5` 避免高频探测,减轻系统负担。
集成场景与优势
  • 适用于容器启动前的前置检查,保障服务依赖顺序
  • 轻量级实现,无需引入额外依赖
  • 配合 Docker 的 HEALTHCHECK 指令可实现自动化探活

4.4 案例四:结合Python脚本实现复杂依赖判断

在现代CI/CD流程中,任务间的依赖关系可能涉及多个外部系统状态,静态配置难以满足动态判断需求。通过引入Python脚本,可实现灵活的条件控制。
脚本执行逻辑
使用Python读取远程API、数据库或文件状态,综合判断是否触发后续步骤:

import requests
import json

# 检查数据同步服务是否完成
def check_sync_status():
    try:
        resp = requests.get("http://api.example.com/sync/status")
        return resp.json().get("completed", False)
    except:
        return False

if __name__ == "__main__":
    if check_sync_status():
        print("::set-output name=proceed::true")  # GitHub Actions 输出
    else:
        print("::set-output name=proceed::false")
该脚本调用外部接口获取同步状态,根据返回结果设置流程输出变量 `proceed`。CI平台可根据此值决定是否继续部署。
集成方式
  • 在流水线中以独立步骤运行该脚本
  • 捕获标准输出作为条件分支依据
  • 结合重试机制提升判断可靠性

第五章:构建高可用微服务部署体系的未来方向

随着云原生生态的演进,微服务部署正向更智能、更自动化的方向发展。服务网格与 Kubernetes 的深度集成已成为主流趋势,Istio 和 Linkerd 提供了精细化的流量控制与可观测性能力。
服务版本灰度发布策略
基于 Istio 的流量镜像与权重分流机制,可实现零停机升级。以下为虚拟服务配置示例:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: user-service-route
spec:
  hosts:
    - user-service
  http:
  - route:
    - destination:
        host: user-service
        subset: v1
      weight: 90
    - destination:
        host: user-service
        subset: v2
      weight: 10
多集群容灾架构设计
企业级系统普遍采用跨区域多集群部署。通过 KubeFed 或 Rancher 的 Fleet 实现配置同步与故障切换。
  • 主集群位于华东区,承载 80% 流量
  • 灾备集群部署于华北区,实时同步 etcd 数据
  • 全局负载均衡器基于 DNS 权重切换入口流量
  • 服务注册中心采用 Consul 多数据中心模式
自动化弹性伸缩实践
结合 Prometheus 指标与 KEDA(Kubernetes Event-Driven Autoscaling),可根据消息队列积压动态扩缩 Pod。
指标类型阈值响应动作
CPU 使用率>75%HPA 增加副本
RabbitMQ 队列长度>1000KEDA 触发扩容
HTTP 错误率>5%触发熔断降级
Scratch全攻略:从入门到实践的编程之旅 Scratch 是一款由麻省理工学院(MIT)开发的图形化编程工具 ,它诞生的初衷是为了让编程教育更加普及,尤其是让孩子们能够轻松接触和学习编程。与传统的基于文本代码的编程方式不同,Scratch 通过将编程指令以图形化的积木形式呈现,极大地降低了编程的门槛,让编程变得如同搭积木一样简单有趣。 阅读详情

相关推荐

(保姆教程)Spyder 配置Tensorflow(2.5.0)和keras(2.4.3)

(保姆教程)Spyder 配置Tensorflow(2.5.0)和keras(2.4.3)

qq_43102225的博客 1万+

Mem0私有化部署

Mem0私有化部署

weixin_73155726的博客 771

我花3年踩坑总结的C#上位机开发指南:从零基础到项目落地(附实战案例)

串口乱码:编码格式不匹配,一定要和设备端确认;PLC连接超时:检查IP地址和端口,确保上位机和PLC在同一网段;界面卡死:耗时操作没开线程,WinForm用BackgroundWorker,WPF用Task;数据解析错误:寄存器地址算错(Modbus地址从0还是1开始);Modbus数据丢包:加CRC校验,重要数据重发机制;WPF绑定不生效:忘记实现INotifyPropertyChanged;项目打包失败:缺少依赖DLL,用Dependency Walker检查;现场环境不兼容。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1843

【微服务部署必看】:Docker Compose depends_on条件的真相与替代方案

解决微服务依赖难题,揭秘Docker Compose depends_on条件的真实限制与应对策略。涵盖服务启动顺序控制、健康检查配置及替代方案如wait-for-it的实战应用,提升部署稳定性。微服务架构优化必读,值得收藏。

VarIsle的博客 967

昆仑通态,自由串口通讯

软件默认无该功能,需要问客服索要扩展包。

cfqq1989的博客 1540

从零到一:Livox Mid-360 激光雷达的硬件集成与避坑实战

本文详细介绍了Livox Mid-360激光雷达的硬件集成全流程,包括硬件准备、网络配置、驱动编译和常见问题解决方案。通过实战经验,帮助开发者高效完成从设备拆箱到数据输出的完整链路,避免在IP设置、驱动编译和固件兼容性等环节踩坑。

salt的博客 1030

【Docker Compose启动顺序控制】:深入解析depends_on的正确使用与陷阱规避

掌握Docker Compose depends_on 启动顺序控制技巧,精准解决服务依赖问题。适用于微服务、数据库依赖等场景,详解condition条件配置与启动陷阱规避,确保容器按需启动。配置灵活可靠,提升部署效率,值得收藏。

CompiLume的博客 810

距离多普勒谱(RD谱)绘制方法及理解

RD谱是信号处理领域常用的图形。原始信号往往是一维时域序列,如何将其二维化,并进行变换生成RD谱呢?由于刚刚接触,查阅了网络上、老师手里的资料,发现RD谱的绘制方法并不统一,有些存在一定问题。在此,将心得体会记录下来。

mddh_123的博客 3万+

Docker Compose服务编排难题破解,depends_on与healthcheck协同实战

破解Docker Compose服务启动依赖难题,详解depends_on条件与healthcheck协同配置方法。适用于微服务容器编排场景,确保服务按健康状态有序启动,提升部署稳定性。实战配置方案值得收藏

LogicGap的博客 639

[QMT量化交易小白入门]-五十、十年基本保证每年盈利,全天ETF候稳稳的幸福

全局参数raise_rate = -1 # 触发rebalance的上涨比例period: 设定为22,表示每22个交易日执行一次调仓(即大约每月一次)。这是策略的时间框架基础。raise_rate: 初始值设为-1,意味着默认情况下不会因为资产的涨幅而触发调仓。这一参数用于控制是否基于资产表现动态调整仓位。run_count: 用于记录策略运行的次数,帮助判断何时执行定期调仓。1、为了简便计算,回撤时将调仓再平衡是先卖出再买入,没有比较持仓,实盘时是需要计算的,减少交易费用。

木头大左的博客 807

智能车图像处理22-进阶篇14--小s的判断

这篇文章中主要讲述智能车图像处理中 : 小s的判断方法。

taiyuezyh的博客 2571

揭秘Docker Compose中的depends_on陷阱:为什么你的服务仍启动失败?

掌握Docker Compose的依赖管理技巧,解决服务因启动顺序失败的问题。详解depends_on的局限性与wait-for-it、healthcheck等实用方案,确保容器按正确顺序运行。适用于微服务、数据库依赖等场景,提升部署稳定性,值得收藏。

QuickProceed的博客 889

基于STM32、HAL库的CH9434总线转UART驱动程序设计

CH9434是一款USB转4串口控制芯片,可以将单个USB接口扩展为4个独立的串口(UART)。支持多种数据格式(数据位5-8,停止位1/1.5/2,奇偶校验或无校验)// 读取接收到的数据。// 重新启动接收中断。// 向所有4个串口发送数据。// UART初始化函数示例(USART1)// 其他UART初始化函数类似...// 初始化CH9434。// 初始化UART1。// 初始化UART2。// 初始化UART3。// 初始化UART4。工作电压:3.3V/5V兼容。

corlin6688的博客 990

如何确保容器按顺序启动?docker-compose depends_on使用陷阱全曝光

掌握docker-compose启动顺序控制技巧,避免服务依赖失效。本文详解depends_on的使用陷阱与正确配置方法,适用于数据库、微服务等场景,确保容器按需启动。配合健康检查实现真正有序初始化,提升部署稳定性,值得收藏。

Instrustar的博客 895

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NTscan扫描工具

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

【微服务部署必看】:Docker Compose中依赖重启的7个隐藏陷阱与规避技巧

掌握Docker Compose依赖重启的正确处理方式,避免微服务部署中的常见故障。本文详解7大隐藏陷阱及应对策略,涵盖启动顺序、健康检查配置与服务依赖管理,提升系统稳定性。运维和开发人员必读,值得收藏。

BytePerch的博客 839

深度学习工具包 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")

Docker Compose启动顺序失控?一文搞懂depends_on与condition的协同机制

解决Docker Compose启动顺序失控难题,深入解析depends_on与condition协同机制。适用于微服务依赖场景,通过条件控制确保容器按需启动,提升部署稳定性。配置方法清晰易懂,运维效率显著提升,值得收藏。

LogicGap的博客 482

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

(Docker Compose依赖管理黑科技):超越depends_on的精准服务启动控制术

掌握Docker Compose依赖管理难题,本文深入解析depends_on条件的局限与突破方案。结合wait-for-it和健康检查实现精准服务启动顺序控制,适用于微服务、数据库依赖等场景。告别启动错乱,提升容器编排可靠性,值得收藏。

VarLens的博客 991

【专家亲授】:Docker Compose中服务依赖与条件重启的最佳实践方案

掌握Docker Compose服务依赖条件重启难题,本文详解服务启动顺序控制与健康检查触发重启的最佳实践,适用于微服务依赖数据库、缓存等场景。通过depends_on配合condition: service_healthy实现精准依赖,提升容器协同稳定性,值得收藏。

CodePulse的博客 1129

揭秘Docker Compose中的depends_on陷阱:为什么服务仍启动失败?

掌握Docker Compose的服务依赖配置技巧,解析depends_on为何无法确保启动顺序。结合healthcheck与restart策略,精准控制服务依赖关系,避免容器启动失败。适用于微服务、数据库依赖等场景,提升编排可靠性,值得收藏。

FastSolve的博客 312

服务启动总失败?,一文搞懂Docker Compose依赖配置陷阱与避坑指南

掌握Docker Compose服务依赖配置技巧,解决容器启动顺序导致的服务失败问题。涵盖depends_on局限、健康检查判断依赖、wait-for脚本应用等实用方案,提升微服务部署稳定性。避坑指南值得收藏。

ByteChat的博客 846

Docker Compose依赖服务配置陷阱(90%开发者都踩过的坑)

掌握Docker Compose依赖服务条件配置技巧,避免容器启动失败。详解depends_on与健康检查结合使用方法,适用于微服务、数据库依赖等场景,提升编排可靠性。配置误区深度解析,值得收藏。

Algorhythm的博客 708

免费开源的 Deep-Live-Cam 实时换脸指南:一张照片,本地快速出效果

Deep-Live-Cam 是免费开源的本地实时换脸工具:给一张正面照片,摄像头或视频里的脸即刻替换,全程不上传数据。适合主播换形象、短视频二创,选脸、选目标、启动,十分钟出效果;追求影视级写实感的内容制作不适合它。 ## 三十秒速览 - 定位:单图驱动实时换脸,无需训练数据集 - 上手成本:装依赖、放模型,一条命令启动 - 硬件门槛:纯 CPU 能跑,独显更流畅 - 能力上限:直播实时可用,

gitblog_00324的博客 505

Docker Compose服务依赖管理被严重低估?,掌握这5个高级技巧让你的部署稳如磐石

掌握Docker Compose多模态服务的启动顺序管理技巧,解决微服务部署中的依赖混乱问题。涵盖depends_on配置、健康检查、启动脚本编排等5大实用方法,适用于AI、音视频处理等复杂场景,提升系统稳定性与部署效率,值得收藏

InstrFun的博客 862

Docker Compose依赖重启失效?掌握这3种精准控制策略让你告别容器启动乱序

解决Docker Compose依赖重启启动乱序难题,提供服务依赖精准控制方案。通过depends_on结合条件判断、健康检查机制与自定义启动脚本,确保容器按序初始化。适用于微服务、数据库依赖等场景,提升部署稳定性,值得收藏。

InitFlow的博客 1084

depends_on不生效?90%开发者忽略的健康检查与wait-for-it解决方案

解决Docker服务启动依赖难题,深入解析Docker Compose depends_on条件为何不生效。结合健康检查与wait-for-it脚本,精准控制容器启动顺序,提升微服务部署稳定性。适用多容器协作场景,值得收藏。

IterStream的博客 821

从新手到专家:Docker Compose服务启动前命令配置避坑指南,少走三年弯路

掌握Docker Compose服务启动前命令配置技巧,解决依赖服务未就绪问题。涵盖wait-for-it、自定义脚本等实用方法,适用于数据库初始化等场景,提升容器协同稳定性,避坑经验总结,值得收藏。

LogicGap的博客 1009
上一篇: 【图数据平台构建必读】:利用Docker快速部署高可用Neo4j集群的4种方案
下一篇: 你还在顺序构建镜像?,了解Docker并行构建带来的革命性效率飞跃
StepNexus
博客等级 码龄1年 175粉丝 2166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值