设想:我在 Spring 中开发了一个微服务,它使用 mysql 8 数据库。
该数据库必须初始化(创建数据库、一些表和数据)。
在我的主机上,我使用 data.sql 和 schema.sql 脚本初始化了数据库。
问题是,我必须设置:
spring.datasource.initialization-mode=always
第一次执行。这会按照我想要的方式初始化我的数据库。
对于将来的运行,我必须注释此命令。非常丑陋的解决方案,但我找不到更好的解决方案,而且我现在没有得到回复question https://stackoverflow.com/questions/49271100/spring-boot-2-initialize-databases-and-tables-only-once。
我认为测试是可以的,但我肯定必须改进它。
目前我想通过 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"
我期望我的数据库由用户初始化,并且在第一次运行时我的微服务用数据初始化数据库。
因此,在下次开始撰写之前,我必须注释该命令并重建图像。 (我知道,丑)
Problem:因此,除了这个丑陋的解决方案之外,我还遇到了运行时问题。
在docker-compose up
我的微服务比数据库的初始化更快。因此它尝试调用数据库导致错误。
因为restart on failure
微服务再次出现。
现在它可以工作了,因为数据库的初始化已经完成。
解决方案:我搜索了 www,这似乎是一个已知问题,可以在短时间内解决wait-for-it.sh
文件。这必须包含在 Dockerfile 中的 COPY 中。
所以我不是专家,但我正在寻找一个好的解决方案:
- 从 spring 内初始化数据库并使我的服务等待 mysql 准备好
- 或者在第一次运行时通过卷在我的容器内的数据库中,当然可以解决这个初始化问题。
我不知道这里的最佳实践是什么,我和我将非常感谢您提供一些帮助如何建立它。
仅在第一次运行时加载 sql 文件:
您可以使用下面的撰写文件
version: '2.1'
services:
usermanagement-service:
build: ./UserManagementService
restart: on-failure
ports:
- "7778:7778"
depends_on:
mysqldb:
condition: service_healthy
mysqldb:
image: mysql
volumes:
- ./mysql-data:/var/lib/mysql
- ./mysql-init-files:/docker-entrypoint-initdb.d
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: userdb
MYSQL_USER: testuser
MYSQL_PASSWORD: testuser
ports:
- "3600:3306"
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
timeout: 20s
retries: 10
你必须把你的data.sql
and schema.sql
文件下./docker-entrypoint-initdb.d
目录使用Volumes
欲了解更多信息 https://hub.docker.com/_/mysql.
仅当满足以下条件时才会加载此文件夹中的 SQL 文件DB的数据目录为空(第一次运行db服务)。 (即)在你的情况下./mysql-data
文件夹应该是空的
对于你的第二个问题:
而不是使用wait-for-it.sh
, 您可以使用healthcheck
and service_healthy
. Here usermanagement-service
将启动一次mysqldb
成功执行["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
在指定的时间间隔内。有关 healthcheck 和 dependent_on 的更多详细信息,请参阅here https://docs.docker.com/compose/compose-file/compose-file-v2/#depends_on.
Got test
命令来自here https://stackoverflow.com/a/42757250/9025542.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)