yapi容器化docker部署以及mongodb容器的持久化挂载异常问题
概述
通过docker形式部署yapi,需要准备一个mongodb,然后直接在一个空文件夹里写好Dockerfile,其中通过wget下载yapi的zip包。
基本按照这篇文章:https://www.modb.pro/db/149666 来处理即可
1. 准备mongodb
把mongodb的docker 跑起来, --auth 表示需要密码才能访问
docker run -d --name mongodb -p 27017:27017 -v /usr/local/mongo_data/db:/data/db -v /usr/local/mongo_data/configdb:/data/configdb mongo:4.2 --auth
注意 原文中启动mongo的容器是这样的
首先创建MongoDB的数据卷
docker volumn create mongo_data
然后启动docker run -d --name mongo -p 27017:27017 -v mongo_data:/data mongo:4.2 --auth但是这并不能让data中的文件持久化到宿主机上,原因见后节分析。
这个mongo:4.2就是镜像名+tag,也可以直接写mongo,就是拉取最新latest。
然后进入mongodb的docker进行一些admin的用户配置:(以下全部照抄前文所述的文章里的步骤)
docker exec -it <docker-id> mongo admin
创建一个用户admin
db.createUser({user:'admin',pwd:'123456',roles:[{role:'userAdminAnyDatabase',db:'admin'}]});
登陆db
db.auth("admin","123456")
授予root角色
db.grantRolesToUser("admin", [{role:"root",db:"admin"}])
然后mongodb的操作就结束了,接下来是准备部署yapi
Docker部署yapi
现在开始打镜像!找到一个空文件夹里写一个Dockerfile即可,如下。
FROM node:12-alpine as builder
WORKDIR /yapi
RUN apk add --no-cache wget make
ENV VERSION=1.12.0
RUN wget https://github.com/YMFE/yapi/archive/refs/tags/v${VERSION}.zip
RUN unzip v${VERSION}.zip && mv yapi-${VERSION} vendors
RUN cd /yapi/vendors && npm install --production --registry https://registry.npm.taobao.orgFROM node:12-alpine
ENV TZ="Asia/Shanghai"
WORKDIR /yapi/vendors
COPY --from=builder /yapi/vendors /yapi/vendors
RUN mv /yapi/vendors/config_example.json /yapi/config.json
EXPOSE 3000
ENTRYPOINT ["node"]
构建镜像
docker build -t harbor.xxx.com/yapi:v1.0 .
推送镜像(如果仅需在本地跑不需要,建议备份)
docker push harbor.xxx.com/yapi:v1.0
本地准备好一个配置文件config.json,待会儿会挂载到容器里使用,这样比打进镜像里来说更灵活一些。
(这个db的servername最好写成具体的ip,起码是网络里能连接到的,直接写127.0.0.1好像有问题)
另外就是mongodb的用户名和密码跟前边设定的保持一致。
{"port": "3000","adminAccount": "admin@admin.com","timeout":120000,"db": {"servername": "127.0.0.1","DATABASE": "yapi","port": 27017,"user": "admin","pass": "123456","authSource": "admin"},"mail": {"enable": true,"host": "abc.com","port": 465,"from": "abc@abc.com","auth": {"user": "abc@abc.com","pass": "abc"}}
}
注意在config.json的当前文件夹下执行(因为命令里会包括$PWD):
首先初始化
docker run -it --rm \
--entrypoint npm \
--workdir /yapi/vendors \
-v $PWD/config.json:/yapi/config.json \
yapi run install-server
会看到以下内容:
....
初始化管理员账号成功,账号名:"admin@admin.com",密码:"ymfe.org"
然后启动yapi,尽量换个名字,可能yapi这个名字冲突了
docker run -d --name yapi-server \
--workdir /yapi/vendors \
-p 5000:3000 \
-v $PWD/config.json:/yapi/config.json \
yapi server/app.js
可以看到以下日志输出
log: -------------------------------------swaggerSyncUtils constructor-----------------------------------------------
log: 服务已启动,请打开下面链接访问:
http://127.0.0.1:3000/
log: mongodb load success...
然后访问3000即可。
持久化mongo数据
以下操作不能同步/data/db内的文件到宿主机
挂载卷
-> # docker volume inspect mongo_data
[{"CreatedAt": "2023-07-25T17:36:05+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/mongo_data/_data","Name": "mongo_data","Options": null,"Scope": "local"}
]
可以发现这个用的宿主机路径为/var/lib/docker/volumes/mongo_data/_data
切换到路径上,可以看到确实有两个跟mongo的/data相同的文件夹
root@cloud-virtual-machine [11:30:46 AM] [/var/lib/docker/volumes/mongo_data/_data]
-> # pwd
/var/lib/docker/volumes/mongo_data/_data
root@cloud-virtual-machine [11:30:47 AM] [/var/lib/docker/volumes/mongo_data/_data]
-> # ls
configdb/ db/
但是进入子目录会发现什么都没有
root@cloud-virtual-machine [11:30:48 AM] [/var/lib/docker/volumes/mongo_data/_data]
-> # cd db
root@cloud-virtual-machine [11:31:13 AM] [/var/lib/docker/volumes/mongo_data/_data/db]
-> # ls -l
total 0
但是挂载了该卷的容器内是有东西的
-> # docker exec -it 97f6c5df69db bash
root@97f6c5df69db:/# cd /data/
root@97f6c5df69db:/data# ls
configdb db
root@97f6c5df69db:/data# cd db/
root@97f6c5df69db:~# ls
WiredTiger collection-17--2171366465605763899.wt collection-76--2171366465605763899.wt index-107--2171366465605763899.wt index-3--2171366465605763899.wt index-50--2171366465605763899.wt index-69--2171366465605763899.wt index-91--2171366465605763899.wt
WiredTiger.lock collection-19--2171366465605763899.wt collection-77--2171366465605763899.wt index-12--2171366465605763899.wt index-30--2171366465605763899.wt index-53--2171366465605763899.wt index-73--2171366465605763899.wt index-92--2171366465605763899.wt
WiredTiger.turtle collection-2--2171366465605763899.wt collection-8--2171366465605763899.wt index-13--2171366465605763899.wt index-31--2171366465605763899.wt index-54--2171366465605763899.wt index-75--2171366465605763899.wt index-93--2171366465605763899.wt
WiredTiger.wt collection-4--2171366465605763899.wt collection-88--2171366465605763899.wt index-15--2171366465605763899.wt index-33--2171366465605763899.wt index-55--2171366465605763899.wt index-78--2171366465605763899.wt index-96--2171366465605763899.wt
WiredTigerLAS.wt collection-45--2171366465605763899.wt diagnostic.data index-20--2171366465605763899.wt index-36--2171366465605763899.wt index-56--2171366465605763899.wt index-79--2171366465605763899.wt index-97--2171366465605763899.wt
_mdb_catalog.wt collection-46--2171366465605763899.wt index-1--2171366465605763899.wt index-21--2171366465605763899.wt index-38--2171366465605763899.wt index-59--2171366465605763899.wt index-80--2171366465605763899.wt journal
collection-0--2171366465605763899.wt collection-49--2171366465605763899.wt index-10--2171366465605763899.wt index-22--2171366465605763899.wt index-40--2171366465605763899.wt index-6--2171366465605763899.wt index-82--2171366465605763899.wt mongod.lock
collection-100--2171366465605763899.wt collection-51--2171366465605763899.wt index-101--2171366465605763899.wt index-23--2171366465605763899.wt index-42--2171366465605763899.wt index-60--2171366465605763899.wt index-84--2171366465605763899.wt sizeStorer.wt
collection-103--2171366465605763899.wt collection-52--2171366465605763899.wt index-102--2171366465605763899.wt index-25--2171366465605763899.wt index-47--2171366465605763899.wt index-63--2171366465605763899.wt index-85--2171366465605763899.wt storage.bson
collection-11--2171366465605763899.wt collection-72--2171366465605763899.wt index-105--2171366465605763899.wt index-26--2171366465605763899.wt index-48--2171366465605763899.wt index-64--2171366465605763899.wt index-86--2171366465605763899.wt
collection-16--2171366465605763899.wt collection-74--2171366465605763899.wt index-106--2171366465605763899.wt index-29--2171366465605763899.wt index-5--2171366465605763899.wt index-68--2171366465605763899.wt index-9--2171366465605763899.wt
也就是说,挂载卷与对应容器路径内的文件并不同步。
问题分析与解决
考虑两个方向,一是权限问题,无法写入,而是挂载点冲突,导致挂载configdb和db之后,宿主机目录和docker内的目录其实是两个不相干的环境。
- 考虑是否是权限问题?
root@cloud-virtual-machine [11:38:24 AM] [/var/lib/docker/volumes/mongo_data]
-> # ls -l
total 4.0K
drwxr-xr-x 4 root root 4.0K 2023-08-01 11:14 _data/
但是docker容器是root启动的啊。
- 考虑挂载点冲突问题
找到了一个非常类似的问题:https://forums.balena.io/t/container-volume-can-not-in-sync-with-host-os-volume/17339
根据这个问题中的解决思路,去dockerhub查找一下mongo4.2的Dockerfile:
https://hub.docker.com/layers/arm64v8/mongo/4.2.6/images/sha256-25821e16c7c401986caa09fba3be08b103203a1599edaba8cd34366903b4b3e6?context=explore
可以看到其中有一层是这个挂载:
VOLUME [/data/db /data/configdb]
跟回答问题的老哥说的比较相符:
it seems like you define /data/db and /data/configdb as volumes (https://github.com/andresvidal/rpi3-mongodb3/blob/master/Dockerfile#L28 11). This means that docker will create a new volume on run that holds the data that was specified in the Dockerfile (https://docs.docker.com/engine/reference/#volume 5). So the resin-data volume is mounted at /data and there are two new mount points at /data/db and /data/configdb.
也就是说,在Dockerfile中,已经指定了/data/db和/data/configdb作为卷(volume),docker在运行容器的时候会为此创建一个新的卷,用于存储这两个目录,因此我们设定的mongo_data卷会被挂载到data,而其下的db和configdb是两个与此有别的挂载点。
表现为mongo_data中只包含/data下的configdb和db文件夹,而这两个文件夹中的内容已经被挂载到了另外的卷上,所以并不会同步到mongo_data中。
综上所述,如果要挂载到本地的话,就直接指定/data/db和/data/configdb,不要指定/data。
查看原mongo容器的挂载点:
"Mounts": [{"Type": "volume","Name": "mongo_data","Source": "/var/lib/docker/volumes/mongo_data/_data","Destination": "/data","Driver": "local","Mode": "z","RW": true,"Propagation": ""},{"Type": "volume","Name": "438a9fc537cfcf0848c57ef695a48212660c204738ebfd9dd9f2b5c30b1880a6","Source": "/var/lib/docker/volumes/438a9fc537cfcf0848c57ef695a48212660c204738ebfd9dd9f2b5c30b1880a6/_data","Destination": "/data/configdb","Driver": "local","Mode": "","RW": true,"Propagation": ""},{"Type": "volume","Name": "1204f82b87721509bfb996e36b0d0ab6e9cd1a37fe81ec78284fa50c6f369f43","Source": "/var/lib/docker/volumes/1204f82b87721509bfb996e36b0d0ab6e9cd1a37fe81ec78284fa50c6f369f43/_data","Destination": "/data/db","Driver": "local","Mode": "","RW": true,"Propagation": ""}],
可以验证除了mongo_data外还分别挂载了/db和/configdb到两个其他的地方。
mongodb操作
mongodb数据备份 注意要指定–authenticationDatabase,否则默认的是什么SHA256的方式,会报错。
mongodump --username admin --password mypassword --authenticationDatabase admin --db mydatabase --out ./backup
mongo备份还原
mongorestore -u admin --password 123456 --authenticationDatabase admin --db yapi /backup1053/yapi
相关文章:
yapi容器化docker部署以及mongodb容器的持久化挂载异常问题
概述 通过docker形式部署yapi,需要准备一个mongodb,然后直接在一个空文件夹里写好Dockerfile,其中通过wget下载yapi的zip包。 基本按照这篇文章:https://www.modb.pro/db/149666 来处理即可 1. 准备mongodb 把mongodb的docker…...
MyBatis-XML映射文件
XML映射文件 规范 XML映射文件的名称与Mapper接口名称一致(EmpMapper对应EmpMpper.xml),并且将XML映射文件和Mapper接口放置在相同包下(同包同名) 在maven项目结构中所有的配置文件都在resources目录之下&…...
C++类和对象入门(下)
C类和对象入门 1. Static成员1.1 Static成员的概念2.2 Static成员的特性 2.友元2.1 友元函数2.2 友元函数的特性2.3 友元类 3. 内部类3.1 内部类的概念和特性 4. 匿名对象5. 再次理解类和对象 1. Static成员 1.1 Static成员的概念 声明为static的类成员称为类的静态成员&…...
安卓:实现复制粘贴功能
目录 一、介绍 (一)ClipboardManager介绍 1、ClipboardManager常用方法: 2、获取 ClipboardManager实例 (二)、ClipData介绍 1、创建ClipData对象: 2、获取ClipData的信息: 3、ClipData…...
jenkins pipeline项目
回到目录 将练习jenkins使用pipeline项目,结合k8s发布一个简单的springboot项目 前提:jenkins的环境和k8s环境都已经安装完成,提前准备了gitlab和一个简单的springboot项目 创建一个流水线项目 流水线中选择git,并选择gitlab的…...
机器学习笔记 - YOLO-NAS 最高效的目标检测算法之一
一、YOLO-NAS概述 YOLO(You Only Look Once)是一种对象检测算法,它使用深度神经网络模型,特别是卷积神经网络,来实时检测和分类对象。该算法首次在 2016 年由 Joseph Redmon、Santosh Divvala、Ross Girshick 和 Ali Farhadi 发表的论文《You Only Look Once: Unified, Re…...
Grafana集成prometheus(3.Grafana添加promethus数据)
添加数据库 选择Connections -> Datasources,点击Add New data source,填写Promitheus Server Url,点击 save & test完成配置 添加DashBorad 选择prometheus数据库选择code填入对应的查询公式(监控公式参考Prometheus监控公式)修改面板名称Ti…...
flutter开发实战-实现首页分类目录入口切换功能
。 在开发中经常遇到首页的分类入口,如美团的美食团购、打车等入口,左右切换还可以分页更多展示。 一、使用flutter_swiper_null_safety 在pubspec.yaml引入 # 轮播图flutter_swiper_null_safety: ^1.0.2二、实现swiper分页代码 由于我这里按照一页8…...
基于粒子群改进BP神经网络的时间序列预测,pso-bp时间序列预测
目录 摘要 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 粒子群算法的原理及步骤 基于粒子群算法改进优化BP神经网络的时间序列预测 matlab代码 代写下载链接:https://download.csdn.net/downlo…...
std::string和std::wstring无法前向声明
在.h文件中需要声明返回类型为std::string的函数,这时候需要声明一下std::string,但是发现报错了。 这时候查了一下,发现std::string是typedef的,无法前向声明,这时候只能用include。其主要是考虑到如果为了让string前…...
论文阅读-Neighbor Contrastive Learning on Learnable Graph Augmentation(AAAI2023)
人为设计的图增强,可能会破坏原始图的拓扑结构,同时相邻节点被视为负节点,因此被推离锚点很远。然而,这与网络的同质性假设是矛盾的,即连接的节点通常属于同一类,并且应该彼此接近。本文提出了一种端到端的…...
PostgreSql 进程及内存结构
一、进程及内存架构 PostgreSQL 数据库运行时,使用如下命令可查询数据库进程,正对应上述结构图。 [postgreslocalhost ~]$ ps -ef|grep post postgres 8649 1 0 15:05 ? 00:00:00 /app/pg13/bin/postgres -D /data/pg13/data postgres …...
Elasticsearch 常用 HTTP 接口
本文记录工作中常用的关于 Elasticsearch 的 HTTP 接口,以作备用,读者也可以参考,会持续补充更新。开发环境基于 Elasticsearch v5.6.8、v1.7.5、v2.x。 集群状态 集群信息 1 2 3 4 5 6 7http://localhost:9200/_cluster/stats?pretty http…...
games106 homework1实现
games106 homework1 gltf介绍图: 骨骼动画 动画相关属性: 对GLTF的理解参照了这篇文章: glTF格式详解(动画) GLTF文件格式详解 buffer和bufferView对象用于引用动画数据。 buffer对象用来指定原始动画数据, bufferView对象用来引用buff…...
Pytorch使用VGG16模型进行预测猫狗二分类
目录 1. VGG16 1.1 VGG16 介绍 1.1.1 VGG16 网络的整体结构 1.2 Pytorch使用VGG16进行猫狗二分类实战 1.2.1 数据集准备 1.2.2 构建VGG网络 1.2.3 训练和评估模型 1. VGG16 1.1 VGG16 介绍 深度学习已经在计算机视觉领域取得了巨大的成功,特别是在图像分类任…...
安装nvm使用nvm管理node切换npm镜像后使用vue ui管理构建项目成功
如果安装nvm前已经单独安装过node.js的请先自行卸载原有node和环境变量里面的配置; 亲测成功,有哪些问题可以在评论区发消息或者私聊我 1、安装nvm的步骤如下 下载nvm安装包 在nvm的GitHub仓库,如下是国内镜像仓库: 点击这里跳…...
在线LaTeX公式编辑器编辑公式
在线LaTeX公式编辑器编辑公式 在编辑LaTex文档时候,需要输入公式,可以使用在线LaTeX公式编辑器编辑公式,其链接为: 在线LaTeX公式编辑器,https://www.latexlive.com/home 图1 在线LaTeX公式编辑器界面 图2 在线LaTeX公式编辑器…...
【C、C++】学习0
C、C学习路线 C语法:变量、条件、循环、字符串、数组、函数、结构体等指针、内存管理推荐书籍:《C Primer Plus》、《C和指针》、《C专家编程》 CC语言基础C的面向对象(封装、继承与多态)特性泛型模板STL等等推荐书籍(…...
python GUI nicegui初识一(登录界面创建)
最近尝试了python的nicegui库,虽然可能也有一些不足,但个人感觉对于想要开发不过对ui设计感到很麻烦的人来说是很友好的了,毕竟nicegui可以利用TailwindCSS和Quasar进行ui开发,并且也支持定制自己的css样式。 这里记录一下自己利…...
【单片机】51单片机串口的收发实验,串口程序
这段代码是使用C语言编写的用于8051单片机的串口通信程序。它实现了以下功能: 引入必要的头文件,包括reg52.h、intrins.h、string.h、stdio.h和stdlib.h。 定义了常量FSOC和BAUD,分别表示系统时钟频率和波特率。 定义了一个发送数据的函数…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
