首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Docker容器运行MyBatis迁移的最正确方法

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

Stack Overflow用户
提问于 2020-11-02 14:39:39
回答 2查看 506关注 0票数 1

我正在试图弄清楚如何以及何时从部署在Docker中的Docker容器中运行mybatis迁移。我是说:我需要最正确的方法。

目前,我们从Dockerfile构建一个Docker容器

代码语言:javascript
复制
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脚本包含

代码语言:javascript
复制
mvn resources:resources migration:up -Dmigration.path="target/classes/migrations" -Dmigration.env=development -Papply_migrations
java -jar /app.jar

但是,通过这种方式,我们必须从Ubuntu构建一个映像,安装Maven,并将环境中的迁移“硬编码”到start.sh文件中,因此我们需要来自不同env的不同文件。

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

提前谢谢。

编辑:我发现了一个有用的解决方案,可以使用DockerHub上找到并由@h3adache发布的mybatis映像,但仍然存在一个问题,试图在DockerSwarm上执行它:这个问题与主机文件夹之间挂载的带有mybatis迁移文件的卷和容器文件夹"/migration“有关。

代码语言:javascript
复制
-v $PWD:/migration

我的船坞-合成人

代码语言:javascript
复制
  mybatis-migration:
    image: mybatis/migrations
    volumes:
      - ./mybatis-migrations:/migration
    command:
      - up

它在本地工作良好,但在使用MySQL管道的部署过程中失败。

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

这是错误消息:

类型“bind”的挂载配置无效:绑定源路径不存在

我怎么才能解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2020-11-02 15:13:08

让我们先看看maven的问题。我知道您(非常正确)不想安装maven (可能还有JDK)。

有两种方法可以实现你所需要的。

运行时模式升级

当应用程序启动时,您可以直接从它运行迁移。如果您部署web应用程序,则可以从主方法或自定义javax.servlet.ServletContextListener运行它。

下面是它的样子:

代码语言:javascript
复制
new UpOperation().operate(
  new DataSourceConnectionProvider(dataSource),
    new JavaMigrationLoader("mycompany.migration.script"), null, null);

检查文献资料以及如何配置它的详细信息。

这将只需要包括迁移到项目的依赖项(您可能已经拥有)。

直接使用霉菌迁移库

另一种方法是直接运行mybaits迁移,即不使用maven。这可以通过按照文档中的描述在坞内安装库来完成。请注意,您只需要库本身和JRE,所以不需要JDK和maven。

然后,您可以使用migrate脚本运行迁移,该脚本是发行版存档的一部分。

环境

为了解决这个问题,您可以将它作为参数传递给运行start.sh的坞容器。一种选择是通过--env选项为docker service createdocker run使用环境变量。通过这种方式传递的变量可以作为start.sh中的一个常规环境变量访问。

票数 1
EN

Stack Overflow用户

发布于 2020-11-02 19:38:27

我建议您遵循指南i 张贴在媒体上,它使用官方的Migrations 码头枢纽图像

它给你一个“开箱即用”的对接体验,并允许你瞄准不同的环境(正如我的帖子中提到的)。

tl;dr

  1. 使用https://hub.docker.com/r/mybatis/migrations作为您的基本图像。
    • 这使您可以从方框中迁移命令。

  2. 您可以添加操作,而不是使用来自post的.gitlab-ci.yml (例如。( migrate up)作为您的对接者图像、入口点或命令。
  3. 您可以控制env或直接影响使用docker --env使用的参数。

例如:

代码语言:javascript
复制
docker run \
--rm \
--env "MIGRATIONS_URL=jdbc:mysql://$(hostname):3306/mb_migration" \
-v $PWD:/migration \
-it mybatis/migrations status
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64647625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档