spring-boot - Cloud Run - 我的应用程序每天都需要新的数据库文件
问题描述
我有一个 dockerized Spring Boot 应用程序,想在 Cloud Run 中运行它。问题是我需要每天更新 db 文件(大约 1MB)。
我有什么选择?
- 每天使用 CD 构建新的 docker 映像 - 部署过程中有一些失败的风险,只有 db 正在改变
- 在开始和每天从存储中下载文件 - 但我无法控制容器的生命周期
- 作为 ENV 变量传递 - 太大?
你怎么看?
解决方案
如果您想保持代码原样,您的解决方案是每天构建一个新容器。如果你正确定义了你的 Dockerfile,它就没有那么危险了。实际上,在之前执行所有构建步骤,并且只在容器的最新层上添加 db 文件。
就像这样,每天,当您构建容器时,如果前一层保存在缓存中(取决于您的 CI/CD 平台),则只会替换最新的层,并且容器会像这样构建。你的代码不会改变,你不应该有打包和部署的风险。
您将 db 文件放在 Cloud Storage 上的想法不太好。当然你有一个版本问题,但你也有一个冷启动问题。实际上,当您的 Cloud Run 实例启动时,它必须先下载文件,然后再执行正常启动。Spring Boot 在 Cloud Run 上启动已经很慢了,在这种冷启动上添加外部依赖和下载延迟并不是一个好主意。
如果您可以处理您的代码,.db 文件意味着您有一个 SQL 数据库(我不知道是哪一个,可能是 DB2 或 SQLite)。如果你使用抽象层,比如 Hibernate,很容易切换到另一个 db 引擎,例如使用 Cloud SQL MySQL 实例。
当然,成本不一样,但更容易管理 Cloud Run 部署。但是,您仍然需要创建一个流程(CI/CD 作业?)来更新和部署 Cloud SQL 上的新数据。版本控制也是一个问题(即使您可以在 CI/CD 管道中手动执行快照以在导入新数据之前保存 Cloud SQL 数据。
推荐阅读
- node.js - MongoDB无法在NodeJS的另一个文件中获取集合
- python - 为什么添加图例后我的 python 绘图代码运行如此缓慢?
- python - 分割算法
- python - Smtplib 在 python3 中给出错误。不明白为什么
- javascript - 在 ReactJs 中持续观察条件是否为真而不渲染
- rust - fn 项和 fn 指针之间的实际区别是什么?
- prisma - 如何使用 Prisma 过滤没有相关记录的记录?
- php - 当数组是普通数组和嵌套数组的混合时,显示数组中的所有数据
- python - Popen 获取 TypeError:预期的 str、字节或 os.PathLike 对象,而不是 linux 上的元组
- python - 如果列名匹配,则将数据框列值更改为行