如何在Docker中初始化数据库并启动Flyway
Docker是一种流行的虚拟化技术,被广泛用于快速构建、打包和部署应用程序。MySQL是最常见的关系型数据库之一,例如,它可以用于存储应用程序数据。Flyway是一种开源数据库迁移工具,可以管理关系型数据库中的结构更改和版本控制。如何在Docker中初始化数据库并启动Flyway是本文将要介绍的内容。
阅读更多:MySQL 教程
创建Docker Compose文件
要在Docker中运行MySQL和Flyway,首先需要创建一个Docker Compose文件。以下是示例文件的内容:
version: '3.8'
services:
db:
image: mysql:latest
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: my_db
volumes:
- ./mysql_data:/var/lib/mysql
flyway:
build: flyway
depends_on:
- db
volumes:
- ./sql:/flyway/sql
command: -url=jdbc:mysql://db:3306/my_db -user=root -password=example migrate
这个文件定义了两个服务,一个是MySQL数据库,另一个是Flyway。在这个文件中,MySQL数据库通过“mysql:latest”镜像运行。该服务暴露了MySQL的默认端口3306,并配置了环境变量以设置root用户的密码和数据库的名称。
Flyway使用了Dockerfile构建,并且依赖于MySQL服务。在这个文件中,两个服务之间的依赖关系通过“depends_on”字段定义。此外,Flyway的Docker容器将“sql”目录挂载为/ flyway / sql文件夹,并且在启动时执行“migrate”命令。
Flyway的SQL脚本
在使用Flyway进行数据迁移之前,需要创建一些SQL脚本。这些脚本包括更新数据库模式的DDL和插入数据的DML语句。Flyway遵循特定的命名约定来解决SQL脚本,例如:
V1__create_table.sql
V2__add_column.sql
这些文件名以“V”开始,后面跟着版本号、两个下划线和描述性的名称。例如,文件“V1__create_table.sql”将被Flyway视为版本1的新安装脚本。
以下是示例脚本,用于创建名为“users”的表:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(50)
);
保存此脚本为“V1__create_users.sql”,并将文件放置在“sql”目录中。
初始化数据库
当Docker容器启动时,MySQL服务可以通过环境变量来初始化数据库。在上述Docker Compose文件中,MYSQL_DATABASE变量设置为“my_db”,表示MySQL将创建名为“my_db”的数据库。
但是,Flyway迁移需要MySQL数据库已经存在,而Docker Compose文件的初始化不保证Flyway能够成功启动。因此,需要手动在MySQL中创建数据库,并设置Flyway的结果表。
首先,进入MySQL的容器命令行(可以使用Docker Compose exec命令):
$ docker-compose exec db mysql -u root -p
输入MYSQL_ROOT_PASSWORD环境变量中设置的密码,即“example”:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_db |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
现在,可以通过发出以下命令来创建版本控制表:
CREATE TABLE flyway_schema_history (
installed_rank INT NOT NULL,
version VARCHAR(50) NOT NULL,
description VARCHAR(200) NOT NULL,
type VARCHAR(20) NOT NULL,
script VARCHAR(1000) NOT NULL,
checksum INT,
installed_by VARCHAR(100) NOT NULL,
installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
execution_time INT NOT NULL,
success TINYINT(1) NOT NULL
);
该表将用于记录Flyway已经执行的脚本和版本信息。使用下面的命令查看Flyway是否安装成功:
mysql> show tables;
+-------------------------+
| Tables_in_my_db |
+-------------------------+
| flyway_schema_history |
+-------------------------+
1 row in set (0.00 sec)
现在,MySQL数据库已经初始化并准备好接受Flyway脚本的执行。
运行Flyway
一旦初始化MySQL,就可以运行Flyway进行数据库迁移了。使用以下命令启动Docker Compose服务:
$ docker-compose up
这将启动MySQL和Flyway服务。Flyway将查找位于sql目录下的脚本,并根据特定的命名约定执行它们。在上面的示例中,Flyway将执行名为V1__create_users.sql的脚本。输出应该类似于以下内容:
flyway_1 | Flyway Community Edition 7.3.2 by Redgate
flyway_1 | Database: jdbc:mysql://db:3306/my_db (MySQL 8.0)
flyway_1 | Successfully validated 1 migration (execution time 00:00.063s)
flyway_1 | Creating Metadata table: `my_db`.`flyway_schema_history`
flyway_1 | Current version of schema `my_db`: << Empty Schema >>
flyway_1 | Migrating schema `my_db` to version "1 - create users table"
flyway_1 | Successfully applied 1 migration to schema `my_db` (execution time 00:00.261s)
这表明Flyway已经成功地迁移了位于V1__create_users.sql文件中的脚本,并在MySQL数据库中创建了名为“users”的表。
总结
Docker是一种极其有用的虚拟化技术,可以大大加快应用程序的打包和部署。当与MySQL和Flyway这样的工具一起使用时,可以大大简化数据库的管理和维护。在本文中,我们介绍了如何创建Docker Compose文件来运行MySQL和Flyway,在Flyway中创建SQL脚本,并使用Flyway进行数据库迁移。虽然过程涉及一些复杂的步骤,但是一旦你理解了如何进行初始化和迁移,就可以轻松地在Docker容器中运行MySQL和Flyway,并使用它们来管理你的关系型数据存储。
极客教程