【发布时间】:2019-06-26 01:21:47
【问题描述】:
场景: 我在 Spring 中开发了一个使用 mysql 8 数据库的微服务。 这个数据库必须被初始化(创建一个数据库,一些表和数据)。 在我的主机上,我使用 data.sql 和 schema.sql 脚本初始化了数据库。 问题是,我必须设置:
spring.datasource.initialization-mode=always
第一次执行。这将以我想要的方式初始化我的数据库。 对于未来的运行,我必须评论这个命令。非常难看的解决方案,但我找不到更好的解决方案,我现在没有对此question 作出任何回应。 我认为测试它是可以的,但我肯定必须改进它。 目前我想通过 docker compose 使用 docker 运行我的服务。
预期: 这是 docker-compose 文件。相当简单。我是 docker 世界的新手,所以我想一步一步来。
version: '3' services:usermanagement-service: build: ./UserManagementService restart: on-failure ports: - "7778:7778" links: - mysqldb depends_on: - mysqldb mysqldb: build: ./CustomMySql volumes: - ./mysql-data:/var/lib/mysql restart: on-failure environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: userdb MYSQL_USER: testuser MYSQL_PASSWORD: testuser expose: - "3600"
我期待的是,我的数据库会使用用户进行初始化,并且在第一次运行时,我的微服务会使用数据初始化数据库。 所以在下次开始撰写之前,我必须评论命令并重建图像。 (我知道,丑)
问题:
因此,除了这个丑陋的解决方案之外,我还遇到了运行时问题。
在docker-compose up 上,我的微服务比数据库的初始化速度更快。所以它试图调用 db 导致错误的结果。
由于restart on failure,微服务再次出现。
现在它可以工作了,因为 db 的 init 已经完成。
解决方案:
我搜索了 www,这似乎是一个已知问题,可以在 wait-for-it.sh 文件中解决。这必须包含在 Dockerfile 中的 COPY 中。
所以我不是专家,但我正在寻找一个好的解决方案:
- 在 spring 中初始化数据库并让我的服务等到 mysql 准备好
- 或者在第一次运行时通过卷从我的容器中初始化数据库,当然可以解决这个初始化问题。
我不知道什么是最佳做法
【问题讨论】:
-
不是您问题的直接解决方案。但是,如果您使用 Flyway 之类的数据库迁移工具,则无需注释/取消注释配置属性。 Flyway会根据当前数据库状态自动运行迁移脚本。
标签: mysql spring-boot docker docker-compose init