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,分别表示系统时钟频率和波特率。 定义了一个发送数据的函数…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
