java - 从Docker容器运行MyBatis迁移的最正确方法

标签 java docker mybatis schema-migration

我试图弄清楚如何以及何时从部署在Docker Swarm中的Docker容器运行mybatis模式迁移。我的意思是:我需要最正确的方法来做到这一点。
目前,我们从Dockerfile构建一个Docker容器

FROM ubuntu:18.04
RUN apt-get update && apt-get install -y \
        openjdk-11-jre \
        openjdk-11-jdk \
        maven
    
    ARG JAR_FILE=target/*.jar
    COPY ${JAR_FILE} app.jar
    COPY start.sh start.sh
    
    RUN chmod +x start.sh
    ENTRYPOINT ["/bin/sh","start.sh"]
然后start.sh脚本包含
mvn resources:resources migration:up -Dmigration.path="target/classes/migrations" -Dmigration.env=development -Papply_migrations
java -jar /app.jar
但是通过这种方式,我们必须从Ubuntu构建镜像,安装Maven并在环境“硬编码”下将迁移过程打包到start.sh文件中,因此我们需要来自不同环境的不同文件。
您认为在构建/部署过程中运行这些方案迁移的最正确方法是什么?
提前致谢。

最佳答案

让我们先来看一下Maven的问题。我知道您(很正确)不想安装Maven(可能还有JDK)。
有两种方法可以实现您所需要的。
运行时架构升级
您可以在应用程序启动时直接从其运行迁移。如果部署Web应用程序,则可以从main方法或自定义javax.servlet.ServletContextListener运行。
可能是这样的:

new UpOperation().operate(
  new DataSourceConnectionProvider(dataSource),
    new JavaMigrationLoader("mycompany.migration.script"), null, null);
检查the documentation详细信息如何配置它。
这将仅需要将mybatis迁移包括到项目的依赖项(您可能已经拥有)。
直接使用mybatis迁移库
另一种方法是直接运行mybaits迁移,而无需使用maven。可以通过按照documentation中所述在docker内部安装库来完成。请注意,您只需要库本身和JRE,因此不需要JDK和maven。
然后,您可以使用分发归档文件中的migrate脚本运行迁移。
环境
为了解决这个问题,您可以将其作为参数传递给运行start.sh的docker容器。一种选择是通过--envdocker service createdocker run选项使用环境变量。在Linux中,可以通过start.sh将以这种方式传递的变量作为常规环境变量进行访问。

关于java - 从Docker容器运行MyBatis迁移的最正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64647625/

相关文章:

java - 如何使用 JSlider slider 或 JScrollBar 增加/减少图像的亮度

java - 等待在 Firefox 浏览器中无法工作 (Webdriver selenium 2.0 +Java)

java - 如何在 MyBatis 中使用结果集填充参数映射

java - 在 MyBatis 中使用 SET 语句

java - 使用 GridlayoutManager 如何让 3 个 imageView 填充设备宽度?

java - 是否有组合和标记接口(interface)的解决方法?

reactjs - Kubernetes 不等待 reactjs 加载

docker - Docker-让新容器与预先运行的容器通信

docker - 在树莓派上运行docker时出错

mybatis - 什么时候使用$ vs #?