1

我试图弄清楚如何以及何时从部署在 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 存储库的构建路径中,因此无法找到该目录。

这是错误消息:

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

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

4

2 回答 2

1

我建议您按照我在使用官方 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
于 2020-11-02T19:38:27.757 回答
1

我们先来看一下maven的问题。我了解您(非常正确)不想安装 maven(可能还有 JDK)。

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

运行时模式升级

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

下面是它的样子:

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

查看文档,详细了解如何配置它。

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

直接使用 mybatis 迁移库

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

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

环境

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

于 2020-11-02T15:13:08.353 回答