首页 > 解决方案 > 从 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

它在本地对 dockerized MySQL 运行良好,但在使用 GitLab 管道部署期间失败。

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

这是错误消息:

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

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

标签: javadockermybatisschema-migration

解决方案


我建议您按照我在使用官方 Mybatis Migrations docker hub 图像的媒体上发布的指南进行操作

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

tl;博士

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

例如。

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

推荐阅读