我试图弄清楚如何以及何时从部署在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容器。一种选择是通过--env
或docker service create
的docker run
选项使用环境变量。在Linux中,可以通过start.sh
将以这种方式传递的变量作为常规环境变量进行访问。
关于java - 从Docker容器运行MyBatis迁移的最正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64647625/