当前位置: 首页 > news >正文

docker中设置容器健康检查

文章目录

    • 一、docker-compose方式
    • 二、Dockerfile方式
    • 三、docker run方式
    • 四、查看检查日志

一、docker-compose方式

在docker-compose中加入healthcheck
healthcheck 支持下列选项:
test:健康检查命令,例如 ["CMD", "curl", "-f", "http://localhost/actuator/health"]
interval:健康检查的间隔,默认为 30 秒,单位(h/m/s);
timeout:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30,单位(h/m/s);
retries:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
start-period:应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认 0 秒; (17.05)引入
说明:在此期间的探测失败将不计入最大重试次数。但是,如果健康检查在启动期间成功,则认为容器已启动,所有连续的失败都将计入最大重试次数。和 CMD, ENTRYPOINT 一样,HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效。

HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。命令的返回值决定了该次健康检查的成功与否:

  • 0:成功;
  • 1:失败;
  • 2:保留值,不要使用

容器启动之后,初始状态会为 starting (启动中)。Docker Engine会等待 interval 时间,开始执行健康检查命令,并周期性执行。如果单次检查返回值非0或者运行需要比指定 timeout 时间还长,则本次检查被认为失败。如果健康检查连续失败超过了 retries 重试次数,状态就会变为 unhealthy (不健康)。

注:

  • 一旦有一次健康检查成功,Docker会将容器置回 healthy (健康)状态
  • 当容器的健康状态发生变化时,Docker Engine会发出一个 health_status 事件。
    healthcheck:test: ["CMD","curl","-f","http://localhost:28025/v1/health/check"]# 每次间隔30秒检查一次interval: 30s# 每次检查的超时时间timeout: 10s# 最多重试检查次数retries: 3# redis检查示例   healthcheck:test: ["CMD", "redis-cli", "ping"]interval: 1stimeout: 3sretries: 30# postgresql检查   healthcheck:test: ["CMD", "pg_isready"]interval: 1stimeout: 3sretries: 30# mysql检查   healthcheck:test: ["CMD", "mysql" ,"-h", "mysql", "-P", "3306", "-u", "root", "-e", "SELECT 1", "cache"]interval: 1stimeout: 3sretries: 30
version: '3'
services:mysql:hostname: mysqlimage: 10.10.3.5/cta/mysql_base:01container_name: mysqlvolumes:- ./mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf- ./mysql/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf- ./mysql/init:/docker-entrypoint-initdb.d/#- ./mysql/data:/var/lib/mysql# 给容器赋予root权限  privileged: truenetwork_mode: "host"environment:- MYSQL_ROOT_PASSWORD=123- TZ=Asia/Shanghai- LANG=en_US.UTF-8# 健康检查  healthcheck:# mysqladmin -uroot -p123  ping -h127.0.0.1test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
#      test: [ "CMD", "mysqladmin","-u","root","-p","123" ,"ping", "-h", "127.0.0.1" ]timeout: 45sinterval: 10sretries: 10nginx:hostname: nginximage: nginx:1.20.2volumes:- ./nginx/nginx.conf:/etc/nginx/nginx.conf- ./nginx/platform.conf:/etc/nginx/conf.d/platform.conf- ./nginx/svrshell:/root/svrshell- ./nginx/aiviewer:/root/aiviewer
# 增加cta- ./nginx/dwcta:/root/dwcta
# 增加input挂载- /data1/inputdata:/data1/inputdatacontainer_name: nginxprivileged: truenetwork_mode: "host"environment:- TZ=Asia/Shanghai- LANG=en_US.UTF-8zk:
# zookeeper  修改了zoo.cfg的data和datalog路径 /opt/zk1/zookeeper-3.4.10hostname: zkimage: 10.10.3.5/cta/zookeeper:3.4.10healthcheck:
#      test: ["CMD-SHELL", "curl -sS 127.0.0.1:2181 || exit 1"]test: ["CMD-SHELL", "echo 'ruok' | curl -s telnet://localhost:2181 || exit 1"]interval: 1m30stimeout: 10sretries: 3start_period: 40sdepends_on:mysql:# mysql健康检查通过后,才能启动zk服务condition: service_healthy# condition: service_startedvolumes:- ./zk/zoo.cfg:/conf/zoo.cfg
#      - /opt/zk1/zookeeper-3.4.10/data:/data
#      - /opt/zk1/zookeeper-3.4.10/datalog:/datalogcontainer_name: zkprivileged: truenetwork_mode: "host"#   ports:#     - 2181:2181es_python:hostname: es_pythonimage: es_python:1.1volumes:- /data1/es_data:/usr/share/elasticsearch/datacontainer_name: es_pythonprivileged: truenetwork_mode: "host"environment:- TZ=Asia/Shanghai- LANG=en_US.UTF-8# 应用aiserverconfig:
# 20882 11383hostname: aiserverconfigimage: 10.10.3.5/cta/aiserverconfig-cta_1215_20220112_002:latesthealthcheck:test: ["CMD-SHELL", "curl -sS 127.0.0.1:11383 || exit 1"]interval: 1m30stimeout: 10sretries: 3start_period: 40sdepends_on:mysql:condition: service_healthyzk:condition: service_healthyvolumes:- /etc/sign.conf:/etc/sign.conf- /data1/container-root/aiserverconfig/log:/root/aiserverconfig/log
# 增加input挂载- /data1/inputdata:/data1/inputdatacontainer_name: aiserverconfigprivileged: truenetwork_mode: "host"aiserver:
# 20880 11381hostname: aiserverimage: 10.10.3.5/cta/aiserver-cta_1215_20220112_002:latesthealthcheck:test: ["CMD-SHELL", "curl -sS 127.0.0.1:11381/aiserver/ai/v1/echo || exit 1"]interval: 1m30stimeout: 10sretries: 3start_period: 40sdepends_on:mysql:condition: service_healthyzk:condition: service_healthyaiserverconfig:condition: service_healthyvolumes:- /etc/sign.conf:/etc/sign.conf- /data1/container-root/aiserver/log:/root/aiserver/log
# 增加input挂载- /data1/inputdata:/data1/inputdatacontainer_name: aiserverprivileged: truenetwork_mode: "host"pacsserver:
# 20881 22222 11380hostname: pacsserverimage: 10.10.3.5/cta/pacsserver-cta_1215_20220112_002:latesthealthcheck:test: ["CMD-SHELL", "curl -sS 127.0.0.1:11384/pacs/v2/dicom/echo || exit 1"]interval: 1m30stimeout: 10sretries: 3start_period: 40sdepends_on:mysql:condition: service_healthyzk:condition: service_healthyaiserverconfig:condition: service_healthyaiserver:condition: service_healthyvolumes:- /etc/sign.conf:/etc/sign.conf- /data1/container-root/pacsserver/log:/root/pacsserver/log
# 增加input挂载- /data1/inputdata:/data1/inputdatacontainer_name: pacsserverprivileged: truenetwork_mode: "host"platform:
# 11380 11345hostname: platformimage: 10.10.3.5/cta/platform-cta_1215_20220112_002:latesthealthcheck:test: ["CMD-SHELL", "curl -sS 127.0.0.1:11380/echo || exit 1"]interval: 1m30stimeout: 10sretries: 3start_period: 40sdepends_on:mysql:condition: service_healthyzk:condition: service_healthyaiserverconfig:condition: service_healthyaiserver:condition: service_healthyvolumes:- /etc/sign.conf:/etc/sign.conf- /data1/container-root/platform/log:/root/platform/log
# 增加input挂载- /data1/inputdata:/data1/inputdatacontainer_name: platformprivileged: truenetwork_mode: "host"ocrsvr:
# 28800hostname: ocrsvrimage: 10.10.3.5/cta/ocrsvr-cta_1215_20220112_002:latestdepends_on:mysql:condition: service_healthyzk:condition: service_healthyaiserverconfig:condition: service_healthyaiserver:condition: service_healthyvolumes:- /etc/sign.conf:/etc/sign.conf- /data1/container-root/ocrsvr/log:/root/ocrsvr/log
# 增加input挂载- /data1/inputdata:/data1/inputdatacontainer_name: ocrsvrprivileged: truenetwork_mode: "host"lung:
# 20880 11381hostname: lungimage: 10.10.3.5/cta/lung-cta_1215_20220112_002:latestdepends_on:mysql:condition: service_healthyzk:condition: service_healthyaiserverconfig:condition: service_healthyaiserver:condition: service_healthyvolumes:- /etc/sign.conf:/etc/sign.conf- /data1/container-root/lung/log:/root/lung/log
# 增加input挂载- /data1/inputdata:/data1/inputdata- /tmp/.X11-unix:/tmp/.X11-unixcontainer_name: lungprivileged: truenetwork_mode: "host"environment:- NVIDIA_DRIVER_CAPABILITIES=all- DISPLAY- XAUTHORITYdeploy:resources:reservations:devices:- driver: nvidiacount: allcapabilities: [gpu]

二、Dockerfile方式

假设我们有个镜像是个最简单的 Web 服务,我们希望增加健康检查来判断其 Web 服务是否在正常工作,我们可以用 curl 来帮助判断,其 DockerfileHEALTHCHECK 可以这么写:

Dockerfile

FROM elasticsearch:5.5HEALTHCHECK --interval=5s --timeout=2s --retries=12 \CMD curl --silent --fail localhost:9200/_cluster/health || exit 1
docker build -t test/elasticsearch:5.5 .docker run --rm -d \--name=elasticsearch \test/elasticsearch:5.5

我们可以通过 docker ps,来发现过了几秒之后,Elasticsearch容器从 starting 状态进入了 healthy 状态

#!/bin/bash
# 检测tomcat端口 细心的小伙伴可以在awk把最后一个:后面的端口取出来 会更准确
netstat -luntp |awk '{print $4}'  |grep 8080
if [ $? == 0 ]
thenecho $?exit 0
elseecho $?exit 1
fi
FROM registry.cn-shanghai.aliyuncs.com/yjk-datag/tomcat:v1
MAINTAINER YJK Enterprise Container Images <min@hz-health.cn>
ENV LANG C.UTF-8
ENV PATH /usr/bin:$PATH
RUN    mv /srv/tomcat/tomcat8/  /srv/tomcat/tomcat-haozhuo-video
ADD ROOT.war  /srv/tomcat/tomcat-haozhuo-video/webapps/
ADD health_check.sh  /opt/
EXPOSE 8080 20920
HEALTHCHECK --start-period=60s  --interval=60s --timeout=5s --retries=3 CMD /bin/bash /opt/health_check.sh
# 依赖基础镜像centos7版jdk1.8FROM openjdk:8
# 标签
LABEL maintainer="2022-12-23"
# 传输文件,将search里面的内容考入/opt/search/中
#COPY search /usr/CommandCenter/gis/search
#添加search.tar.gz压缩文件到/opt目录下,并同时完成解压,完成后的目录为opt/search/xxxx
ADD fps.tar.gz /usr/CommandCenter/vcs
# 给启动脚本授可执行权限
RUN chmod +x /usr/fps/bin/docker_startup.sh
RUN chmod +x /usr/fps/bin/get-nacos-status.sh
# 安装curl
RUN apk update && apk add curl && apk add busybox-extras
# 工作目录
WORKDIR /usr/CommandCenter
# 启动startup.sh
CMD ["/bin/sh","-c","/usr/bin/docker_startup.sh"]
#CMD ["/bin/sh","-c","ps&&tail -f /dev/null"]

三、docker run方式

另外一种方法是在 docker run 命令中,直接指明healthcheck相关策略

$ docker run --rm -d \--name=elasticsearch \--health-cmd="curl --silent --fail localhost:9200/_cluster/health || exit 1" \--health-interval=5s \--health-retries=12 \--health-timeout=2s \elasticsearch:5.5

四、查看检查日志

为了帮助排障,健康检查命令的输出(包括 stdout 以及 stderr)都会被存储于健康状态里,可以用 docker inspect 来查看。我们可以通过如下命令,来获取过去5个容器的健康检查结果

docker inspect --format='{{json .State.Health}}' 容器名docker inspect --format='{{json .State.Health}}' commandcenter.public.configcenter
或者
docker inspect 容器名 | jq ".[].State.Health"

日志示例

{"Status": "healthy","FailingStreak": 0,"Log": [{"Start": "2017-08-19T09:12:53.393598805Z","End": "2017-08-19T09:12:53.452931792Z","ExitCode": 0,"Output": "..."},...
}

由于应用的开发者会更加了解应用的SLA,一般建议在Dockerfile中声明相应的健康检查策略,这样可以方便镜像的使用。对于应用的部署和运维人员,可以通过命令行参数和REST API针对部署场景对健康检查策略按需进行调整。

相关文章:

docker中设置容器健康检查

文章目录 一、docker-compose方式二、Dockerfile方式三、docker run方式四、查看检查日志 一、docker-compose方式 在docker-compose中加入healthcheck healthcheck 支持下列选项&#xff1a; test&#xff1a;健康检查命令&#xff0c;例如 ["CMD", "curl&quo…...

azure-cognitiveservices-speech api error while using with AWS Lambda

Azure 语音评估服务 Cancellation Reason 初始化平台失败 1.在mac上安装 pip install azure-cognitiveservices-speech1.30.0正常运行没有问题&#xff0c;服务部署到docker 容器中后调用Azure语音评估服务报错 Cancellation Reason 初始化平台失败 2.解决方案&#xff0c;变…...

系统集成项目管理工程师挣值分析笔记大全

系统集成项目管理工程师挣值分析笔记大全 挣值分析是一种项目管理技术&#xff0c;用于量化和监控项目绩效。它通过比较计划值&#xff08;PV&#xff09;、实际成本&#xff08;AC&#xff09;和挣值&#xff08;EV&#xff09;三个参数来评估项目的进展情况和成本绩效。 挣值…...

TCP 协议【传输层协议】

文章目录 1. 简介1.1 TCP 协议是什么1.2 TCP 协议的作用1.3 什么是“面向连接” 2. 简述 TCP2.1 封装和解包2.2 TCP 报文格式2.3 什么是“面向字节流”2.4 通过 ACK 机制实现一定可靠性 3. 详述 TCP3.1 基本认识TCP 报头格式16 位源/目标端口号32 位序列号*32 位确认应答号4 位…...

Golang 中的 time 包详解(二):time.Duration

在日常开发过程中&#xff0c;会频繁遇到对时间进行操作的场景&#xff0c;使用 Golang 中的 time 包可以很方便地实现对时间的相关操作。接下来的几篇文章会详细讲解 time 包&#xff0c;本文讲解一下 time 包中的 time.Duration 类型。 time.Duration time.Duration 类型是…...

Linux 学习记录58(ARM篇)

Linux 学习记录58(ARM篇) 本文目录 Linux 学习记录58(ARM篇)一、GIC相关寄存器1. 系统框图2. 中断号对应关系 二、GICD寄存器1. GICD_CTLR2. GICD_ISENABLERx3. GICD_IPRIORITYRx4. GICD_ITARGETSRx5. GICD_ICPENDRx 三、GICC寄存器1. GICC_PMR2. GICC_CTLR3. GICC_IAR4. GICC_…...

【一文搞懂】—带霍尔编码器的直流有刷减速电机

文章目录 一、直流有刷电机二、减速比三、霍尔编码器3.1 霍尔编码器3.2 霍尔编码器测速原理 四、测速程序设计4.1 跳变沿检测4.2 计算转速 一、直流有刷电机 宏观上说直流有刷电机由固定部分&#xff08;定子&#xff09;和旋转部分&#xff08;转子&#xff09;组成。在定子上…...

滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句

目录 一、缓冲区溢出的HelloWorld二、永不停止的HelloWorld三、基础知识3.1 变量的声明3.2 类型转换&#xff08;一般用于小转大&#xff09;3.3 表达式3.4 语句和程序块3.5 参数与返回值3.6 关系运算符3.7 逻辑运算符&#xff1a;&& || !3.8 单目运算符3.9 三目运算符…...

Python抓取分享页面的源代码示例

本文章是关于利用Python方法来抓取某网站分享页面中的源码方法示例。需要大家注意的是Python抓取分享页面的源代码示例&#xff0c;是要在运行时导入BeautifulSoup.py文件后才可以使用。 Python抓取分享页面的源代码示例&#xff0c;需要用到python urllib2模块方法&#xff0…...

linux安装nginx遇到的报错

1、Linux如何修改只读文件&#xff08;以设置自动连网为例&#xff09; vim /etc/sysconfig/network-scripts/ifcfg-ens33 然后提示 E45&#xff1a;已设定选项“readonly”&#xff08;请加&#xff01;强制执行&#xff09; 如果需要强制修改&#xff0c;可以使用&#xff0…...

一起学SF框架系列5.8-spring-Beans-Bean注解解析3-解析配置component-scan

本文主要讲述Spring是如何解析“context:component-scan”元素&#xff0c;扫描加载目录下的BeanDefinition。 解析内容 1、解析的元素如下&#xff1a; <!-- 注解模式&#xff1a;配置bean扫描路径&#xff08;注&#xff1a;自动包含子路径&#xff09; --><conte…...

【LeetCode热题100】打卡第42天:滑动窗口最大值搜索二维矩阵II

文章目录 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维矩阵II⛅前言 滑动窗口最大值&#x1f512;题目&#x1f511;题解 搜索二维矩阵II&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维…...

[uni-app] 微信小程序 - 组件找不到/导入报错 (分包问题导致)

文章目录 问题表现问题原因 问题表现 切换了个路径下的组件, 导入失败, 尝试了清缓存\重启\删项目等一些列操作均无效 上面两个路径中, 都存在一模一样的videItem.vue Main路径是可以导入的 Main路径是无法导入的 问题原因 后来发现, 是 分包的问题导致. 我们先来假设一个场…...

从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…...

编程小白的自学笔记十二(python爬虫入门四Selenium的使用实例二)

系列文章目录 编程小白的自学笔记十一&#xff08;python爬虫入门三Selenium的使用实例详解&#xff09; 编程小白的自学笔记十&#xff08;python爬虫入门二实例代码详解&#xff09; 编程小白的自学笔记九&#xff08;python爬虫入门代码详解&#xff09; 目录 系列文章…...

技术笔记2023076 rBoot学习7

技术笔记2023076 rBoot学习7 继续之前的学习。 代码分析&#xff1a;函数find_image() // prevent this function being placed inline with main // to keep mains stack size as small as possible // dont mark as static or itll be optimised out when // using the ass…...

收藏这6个抠图工具,一键抠图不用愁!

在图片编辑工作中&#xff0c;抠图是设计师常用的操作。随着设计工具的不断增加&#xff0c;抠图操作摆脱了过去繁琐的操作步骤&#xff0c;几乎可以一键完成。今天本文将为大家介绍6个好用的抠图工具&#xff0c;一起来看看吧&#xff01; 1、皮卡智能抠图 皮卡智能抠图是一…...

四,Eureka 第四章

2.1.3 增加依赖 <!--添加依赖--><dependencies><!--Eureka Server--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>&l…...

k8s常见的资源对象使用

目录 一、kubernetes内置资源对象 1.1、kubernetes内置资源对象介绍 1.2、kubernetes资源对象操作命令 二、job与cronjob计划任务 2.1、job计划任务 2.2、cronjob计划任务 三、RC/RS副本控制器 3.1、RC副本控制器 3.2、RS副本控制器 3.3、RS更新pod 四、Deployment副…...

JavaScript 简单实现观察者模式和发布订阅模式

JavaScript 简单实现观察者模式和发布订阅模式 1. 观察者模式1.1 如何理解1.2 代码实现 2. 发布订阅模式2.1 如何理解2.2 代码实现 1. 观察者模式 1.1 如何理解 概念&#xff1a;观察者模式定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff…...

从Prompt到成稿|像素剧本圣殿输入剧情大纲→输出标准剧本全流程

从Prompt到成稿&#xff5c;像素剧本圣殿输入剧情大纲→输出标准剧本全流程 1. 工具介绍&#xff1a;像素剧本圣殿 像素剧本圣殿是一款基于Qwen2.5-14B-Instruct大模型深度优化的专业剧本创作工具。它将先进的AI文本生成能力与独特的8-Bit复古视觉风格相结合&#xff0c;为编…...

OpenClaw-DingTalk终极指南:Stream模式钉钉机器人企业级部署实战

OpenClaw-DingTalk终极指南&#xff1a;Stream模式钉钉机器人企业级部署实战 【免费下载链接】openclaw-channel-dingtalk Dingtalk channel plugin for OpenClaw 项目地址: https://gitcode.com/gh_mirrors/op/openclaw-channel-dingtalk OpenClaw-DingTalk是一款专为O…...

从RTL到GDSII:用Design Compiler优化时序的关键20个命令详解

从RTL到GDSII&#xff1a;用Design Compiler优化时序的关键20个命令详解 在先进工艺节点下&#xff0c;时序收敛已成为ASIC设计中最具挑战性的环节之一。当我们从RTL代码出发&#xff0c;最终生成满足PPA&#xff08;性能/功耗/面积&#xff09;目标的GDSII布局布线文件时&…...

当生物黑客入侵脑机接口:安全测试救了我们公司

在脑机接口&#xff08;Brain-Computer Interface, BCI&#xff09;技术飞速发展的今天&#xff0c;软件测试从业者正面临前所未有的安全挑战。作为一名资深测试工程师&#xff0c;我亲历了一场惊心动魄的生物黑客入侵事件——一场针对我们公司脑机接口产品的攻击险些导致灾难性…...

Audio Pixel Studio人声分离应用:KTV原唱提取+伴奏复用创意玩法

Audio Pixel Studio人声分离应用&#xff1a;KTV原唱提取伴奏复用创意玩法 1. 音频处理新体验&#xff1a;从KTV到创意工作室 你是否遇到过这样的情况&#xff1a;在KTV听到一首喜欢的歌&#xff0c;想保存自己的演唱版本&#xff0c;却苦于无法消除原唱&#xff1f;或者想用…...

Kandinsky-5.0-I2V-Lite-5s开源模型部署:无需代码基础的图形化AI视频工具

Kandinsky-5.0-I2V-Lite-5s开源模型部署&#xff1a;无需代码基础的图形化AI视频工具 1. 产品介绍 Kandinsky-5.0-I2V-Lite-5s是一款革命性的图生视频AI工具&#xff0c;它将复杂的视频制作过程简化为几个简单的点击操作。不同于传统需要专业剪辑软件和技能的视频制作方式&am…...

如何高效使用开源工具EnergyStarX提升Windows 11电池续航:完整实战指南

如何高效使用开源工具EnergyStarX提升Windows 11电池续航&#xff1a;完整实战指南 【免费下载链接】EnergyStarX &#x1f50b; Improve your Windows 11 devices battery life. A WinUI 3 GUI for https://github.com/imbushuo/EnergyStar. 项目地址: https://gitcode.com/…...

UE5.0.3打包Linux报错?手把手教你搞定BlueprintJson插件缺失问题

UE5.0.3 Linux打包报错终极指南&#xff1a;BlueprintJson插件问题的深度解析与实战修复 当你满怀期待地在UE5.0.3中点击"打包Linux"按钮&#xff0c;却看到屏幕上弹出关于BlueprintJson插件的红色错误信息时&#xff0c;那种挫败感我深有体会。作为一名经历过无数次…...

快速搭建stm32f103c8t6引脚验证原型:快马平台一键生成初始化代码

最近在做一个基于STM32的小项目时&#xff0c;发现每次新建工程都要重复配置引脚功能&#xff0c;特别浪费时间。后来发现用InsCode(快马)平台可以快速生成初始化代码&#xff0c;简直打开了新世界的大门。今天就来分享下如何用这个平台快速搭建STM32F103C8T6的引脚验证原型。 …...

Delayed Job测试策略完整指南:如何在开发和测试环境中高效测试异步任务

Delayed Job测试策略完整指南&#xff1a;如何在开发和测试环境中高效测试异步任务 【免费下载链接】delayed_job 项目地址: https://gitcode.com/gh_mirrors/de/delayed_job Delayed Job是Ruby on Rails生态系统中最受欢迎的异步任务处理库之一&#xff0c;它让开发者…...