当前位置: 首页 > 知识库问答 >
问题:

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

翁硕
2023-03-14

我试图弄清楚如何以及何时从部署在Docker群中的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"]

然后开始。sh脚本包含

mvn resources:resources migration:up -Dmigration.path="target/classes/migrations" -Dmigration.env=development -Papply_migrations
java -jar /app.jar

但是通过这种方式,我们必须从Ubuntu构建一个映像,安装Maven,并在迁移开始时使用“硬编码”环境。sh文件,因此我们需要来自不同环境的不同文件。

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

提前谢谢。

编辑:我发现使用DockerHub上找到并由@h3adache发布的mybatis migration docker映像的解决方案很有用,但在DockerSwarm上执行该映像时仍然存在问题:该问题与装载在带有mybatis migrations文件的主机文件夹和容器文件夹“/migration”之间的卷有关

-v $PWD:/migration

我的码头工人。yml是

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

它在本地针对停靠的MySQL运行良好,但在使用GitLab管道部署时失败。

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

这是错误消息:

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

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

共有2个答案

邵祺
2023-03-14

我建议你遵循我在媒体上发布的指南,该指南使用官方的Mybatis Migrations docker中心图像

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

tl; dr

  • 使用https://hub.docker.com/r/mybatis/migrations作为基本映像。
    • 这为您提供了开箱即用的迁移命令

    eg.

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

梁俊友
2023-03-14

让我们先看看maven的问题。我理解您(完全正确地)不想安装maven(可能还有JDK)。

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

您可以在应用程序启动时立即运行迁移。如果您部署Web应用程序,它可以从main方法或自定义javax.servlet.ServletContextListener运行。

它看起来是这样的:

new UpOperation().operate(
  new DataSourceConnectionProvider(dataSource),
    new JavaMigrationLoader("mycompany.migration.script"), null, null);

查看文档,了解如何配置此功能的详细信息。

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

另一种方法是直接运行mybaits迁移,这是没有maven。这可以通过在docker中安装库来完成,如留档中所述。请注意,您只需要库本身和JRE,因此不需要JDK和maven。

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

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

 类似资料:
  • 本文向大家介绍docker容器跨服务器的迁移的方法,包括了docker容器跨服务器的迁移的方法的使用技巧和注意事项,需要的朋友参考一下 docker的备份方式有export和save两种。 export是当前的状态,针对的是容器,docker save 是针对镜像images。 export 找出要备份容器的ID 备份 export是把容器打成一个tar包。 恢复 把刚才备份的centos_dem

  • 可以移除不运行的容器吗? 我知道,例如,这将从创建的图像中删除容器 但我想知道如何移除那些没有运行的

  • 我有以下Dockerfile: 以及以下docker-compose.yml: 如果我通过docker cmd以以下方式手动运行Dockerfile: 看起来一切正常,我得到了它实际执行的应用程序输出日志: 但是,当我试图通过docker-comment以以下方式执行我的应用程序时: 我的应用程序似乎启动正常,但无法继续执行。以下是输出: 我尝试执行show logs命令: 但我得到的唯一记录是第

  • 本文向大家介绍mysql数据迁移到Oracle的正确方法,包括了mysql数据迁移到Oracle的正确方法的使用技巧和注意事项,需要的朋友参考一下 在mysql数据库里有一个表student,它的结构如下: 在Oracle数据库里有一个表from_mysql,它的结构如下: 现在要把数据从mysql的student转移到Oracle的from_mysql中去,这里笔者借助kettle的spoon工

  • 问题内容: 是否可以备份正在运行的Docker容器?该命令适合这样做吗? 问题答案: 一位朋友发表了评论 您好Slava,很抱歉您的问题已关闭。作为记录,Slava谈论的是docker.io,这是Linux容器的运行时。是的,这是一种合适的方法。它将生成整个容器文件系统状态的压缩包,并将其转储到stdout上。所以 将产生可用的tarball。您可以使用以下命令重新导入压缩包 请注意,原始元数据(

  • 本文向大家介绍docker容器中crontab无法正常运行解决方案,包括了docker容器中crontab无法正常运行解决方案的使用技巧和注意事项,需要的朋友参考一下 相信很多人看完docker容器, 需要加crontab, 加完却发现不能执行,心塞.....接着便开始各种折腾... 首先当然是看日志了, 发现/var/log 下面没有任何信息, 那是因为你没有打开rsyslog. 继续看日志 从