场景:我在Spring中开发了一个使用mysql 8数据库的微服务。这个数据库必须被初始化(创建一个数据库、一些表和数据)。在我的主机上,我用data.sql和schema.sql脚本初始化了数据库。问题是,我必须设置:
spring.datasource.initialization-mode=always
第一次执行。这将以我想要的方式初始化我的数据库。对于以后的运行,我必须对该命令进行注释。非常难看的解决方案,但我找不到更好的解决方案,我现在没有得到这个问题的答案。我认为测试它是可以的,但我肯定要提高这一点。目前我想通过docker compose使用docker运行我的服务。
预期:这是docker撰写文件。相当简单。我在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
上,我的微服务比数据库的初始化速度快。因此,它尝试调用导致en错误的db。由于故障时重新启动,微服务再次启动。现在它可以工作了,因为数据库的init已经完成。
解决方案:我搜索了www,它似乎是一个已知的问题,可以在wait it.sh
文件中解决。这必须包含在Dockerfile中的副本中。所以我不是专家,但我正在寻找一个很好的解决方案:
我不知道这里的最佳实践是什么,我和我将非常感谢一些帮助如何建立这一点。
只在第一次运行时加载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
您必须使用Volumes
将data.sql
和schema.sql
文件放置在/docker entrypoint initdb.d
目录下,以了解更多信息。
仅当数据库的数据目录为空时(第一次运行数据库服务),才会加载此文件夹中的SQL文件。(即)在您的情况下,/mysql data
文件夹应为空
关于第二个问题:
您可以使用healthcheck
和service\u health
来代替使用wait it.sh
。一旦mysqldb在指定的时间间隔内成功执行[“CMD”、“mysqladmin”、“ping”、“-h”、“localhost”]
,就会启动用户管理服务。有关healthcheck的更多详细信息,请参阅此处。
从这里获得了
test
命令。
问题内容: 我正在尝试使用MySQL数据库创建一个容器并将架构添加到这些数据库。 我当前的Dockerfile是: 为了创建容器,我遵循Docker提供的文档并执行以下命令: 但是,当我执行此命令时,未创建容器,并且在容器状态下,可以看到未成功执行CMD,实际上仅执行了命令。 无论如何,有没有一种方法可以使用架构初始化数据库,或者我需要手动执行这些操作? 问题答案: 对于如此长的答案,我感到很抱歉
初始化数据 打开MainSetup类,在Daos语句后面插入新建根用户的代码 // 初始化默认根用户 if (dao.count(User.class) == 0) { User user = new User(); user.setName("admin"); user.setPassword
问题内容: 我正在初始化这样的数组: NetBeans在此行指出一个错误: 我该如何解决这个问题? 问题答案: 上面的信息不正确(语法错误)。这意味着你正在分配一个仅可容纳元素的数组。 如果要初始化数组,请尝试使用: 注意两个声明之间的区别。将新数组分配给声明的变量时,new必须使用。 即使你纠正了语法,访问仍然是不正确的(你只能访问,因为Java中的数组索引是基于0的)。访问]将抛出。
问题内容: Using Laradock System Info: Docker版本:17.10.0-ce,构建f4ffd25 OS:Windows 10 Home When I run 遇到错误。以下是 docker日志 [Note] Basedir set to /usr/ [Warning] The syntax ‘–symbolic-links/-s’ is deprecated and
我有以下docker compose文件(): 以及下面的: 然后执行以下命令: 它会导致错误: 在日志中,我看到以下内容: 看起来flyway在数据库初始化之前启动,因此无法连接到数据库,我看到下面的错误。 我怎样才能解决这个问题? 我谷歌了类似的问题,我找到了以下建议:https://github.com/vishnubob/wait-for-it但我是docker的新手,我不明白如何将其放入