java - 从 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 存储库的构建路径中,因此无法找到该目录。
这是错误消息:
“绑定”类型的挂载配置无效:绑定源路径不存在
我怎样才能解决这个问题?
解决方案
我建议您按照我在使用官方 Mybatis Migrations docker hub 图像的媒体上发布的指南进行操作
它为您提供“开箱即用”的 docker 体验,并允许您针对不同的环境(如我的帖子中所述)。
tl;博士
- 用于
https://hub.docker.com/r/mybatis/migrations
您的基本图像。- 这为您提供了开箱即用的迁移命令
.gitlab-ci.yml
您可以将操作(例如migrate up
)添加为您的 docker 映像入口点或命令,而不是使用帖子中的 。- 您可以控制 env 或直接影响使用 docker 使用的参数
--env
例如。
docker run \
--rm \
--env "MIGRATIONS_URL=jdbc:mysql://$(hostname):3306/mb_migration" \
-v $PWD:/migration \
-it mybatis/migrations status
推荐阅读
- python - ParDo 中的分区和多个输出之间的区别?
- hash - 如何在局部敏感散列 (LSH) 中将签名矩阵散列到存储桶
- spring - 为什么我在尝试模拟 WebClient 调用时会在 bodyValue 上获得 NPE?
- rust - 如何避免这个程序的 for 循环和 let 语句
- ios - 在 Objective-C 和 Swift 中编写不返回任何参数且不接受参数的闭包的所有有效方法是什么?
- javascript - 如何在 Vanilla JS 中编写:$(function() {...}?
- javascript - Javascript - 循环延迟 | 为什么这不起作用?
- javascript - 如何使用 socket.io 进行简单的消息传递并响应 useEffect()
- android - 撰写导航中没有方法导航(字符串)
- android - WorkManager 在继续下一个工作请求之前等待上传完成