微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从Docker容器运行MyBatis迁移的最正确方法

我试图弄清楚如何以及何时从部署在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文件中,因此我们需要来自不同环境的不同文件

您认为在构建/部署过程中运行这些方案迁移的最正确方法是什么?

谢谢。

编辑: 我发现有用的解决方案可以使用在dockerhub上找到并由@ h3adache发布的mybatis迁移docker映像,但仍然存在尝试在DockerSwarm上执行它的问题:该问题与mybatis主机文件夹之间安装的卷有关迁移文件和容器文件夹“ / migration”

-v $PWD:/migration

我的docker-compose.yml是

  mybatis-migration:
    image: mybatis/migrations
    volumes:
      - ./mybatis-migrations:/migration
    command:
      - up

它在本地化的MysqL上运行良好,但在使用GitLab管道进行部署时失败。

当我签出代码时,./mybatis-migrations文件夹显然在我的本地主机上,并且当GitLab运行器构建所有东西但不在DockerSwarm主机上时,它位于GitLab存储库的构建路径中。找到该目录。

这是错误消息:

类型为“绑定”的无效安装配置:绑定源路径不存在

我该如何解决

解决: 以这种方式解决:我从官方的“ mybatis / migrations”映像开始创建了一个自定义映像,然后将必要的文件夹复制到其中,并将该映像推送到我们的内部Docker注册表中。然后像其他容器一样部署到DockerSwarm。

FROM mybatis/migrations

workdir /mybatis-migrations/environments
copY environments/ /migration/environments/

workdir /mybatis-migrations/drivers
copY drivers/ /migration/drivers/

workdir /mybatis-migrations/scripts
copY scripts/ /migration/scripts/

workdir /migration
CMD ["up"]

我希望这可以帮助其他人。

解决方法

让我们先来看一下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 create的{​​{1}}选项使用环境变量。通过这种方式传递的变量可以在docker run中的linux中作为常规环境变量进行访问。

,

我建议您遵循指南I posted on medium,该指南使用了官方的Mybatis Migrations docker hub image

它为您提供了“开箱即用”的docker体验,并允许您针对不同的环境(如我的文章中所述)。

tl; dr

  1. https://hub.docker.com/r/mybatis/migrations用于基本图片。
    • 这使您可以立即使用迁移命令
  2. 您可以使用该操作(例如.gitlab-ci.yml)作为docker映像入口点或命令,而不必使用帖子中的migrate up
  3. 您可以控制环境或直接影响使用docker --env使用的参数

例如

docker run \
--rm \
--env "MIGRATIONS_URL=jdbc:mysql://$(hostname):3306/mb_migration" \
-v $PWD:/migration \
-it mybatis/migrations status

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。