如何在Docker中初始化数据库并启动Flyway

如何在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,并使用它们来管理你的关系型数据存储。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程