如何在 Docker Compose 中初始化 MySql 数据库

2024-03-09

设想:我在 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(使用前将#替换为@)

如何在 Docker Compose 中初始化 MySql 数据库 的相关文章

随机推荐

  • 如何使用xslt合并元素?

    我有一个带有元素的段落参考类型 Example 输入文件
  • UILocalNotification 不执行任何操作

    这似乎是一个愚蠢的问题 但这是我第一次使用 UILocalNotification 我无法让它进行快速测试 它只是没有做任何事情 1 我在AppDelegate中创建了2个变量 let today NSDate let notificati
  • Java 中的类型映射

    我想实现这样一个地图 Map
  • 清除核心数据中的上下文:重置与删除注册对象?

    我一直在寻找与此相关的帖子 但我不完全理解 有什么区别 context reset and for NSManagedObjectID objId in objectIds context deleteObject context obje
  • React - 通过单击提交按钮将项目从输入添加到列表中

    我正在练习反应 并尝试通过单击提交按钮将项目添加到输入列表中 我更喜欢使用 state 和 setState 我很想得到一些帮助 我认为不需要我的代码 但无论如何这是它 class App extends Component state u
  • JACOB 库在多线程中使用时失败

    我在两个因此启动的相同线程中使用 JACOB 时遇到了一个奇怪的问题 我有一个实用程序类 它使用静态 ActiveXObject 字段将各种请求分派到 WMI 第一个线程工作正常 当第二个线程启动时 出现以下异常 com jacob com
  • 通过接口枚举 - 性能损失

    我和我的同事就通过索引访问列表的性能发生了一些争议 这非常接近圣战 VS通过枚举器 为了根据一些事实进行操作 我编写了以下测试 static void Main string args const int count 10000000 va
  • 当内存带宽受限时 SSE 和 AVX 的性能

    在下面的代码中 我更改了 dataLen 并获得了不同的效率 dataLen 400 SSE 时间 758000 us AVX 时间 483000 us SSE gt AVX dataLen 2400 SSE 时间 4212000 us A
  • 使用 Android Profiler 时应用程序不断崩溃

    我的应用程序正在执行一些位置跟踪并在需要时更新数据库 该应用程序已运行 2 天 没有任何问题 现在我尝试使用 Android Profiler Android Studio 3 01 但是 一旦我打开它 它就会运行几秒钟 然后开始使应用程序
  • 维基百科示例中高斯-牛顿方法的实现

    我对 Python 比较陌生 正在尝试实现高斯 牛顿方法 特别是维基百科页面上的示例 高斯 牛顿算法 https en wikipedia org wiki Gauss E2 80 93Newton algorithm 3个例子 以下是我到
  • 如何获取字符串中第一行的范围?

    我想更改第一行文本的格式NSTextView 给它不同的字体大小和粗细 使其看起来像标题 因此 我需要第一行的范围 一种方法是这样 guard let firstLineString textView string components s
  • 在 PYMC3 中使用自定义可能性会导致“expected ndarray”错误

    我正在尝试在 PYMC3 中使用自定义分布 广义极值或 GEV 分布 我已经编写了一些代码来计算这个 但我得到一个错误 ValueError 需要一个 ndarray 应用导致错误的节点 MakeVector dtype float64 l
  • 如何在sql中找到运行序列的峰值和谷值

    我在 athena 中有一个数据集 因此出于此目的 您可以将其视为 postgres 数据库 数据样本可以在这里看到sql小提琴 http www sqlfiddle com 17 4b3732 2 这是一个示例 create table
  • 布局 xml 文档中的 Android“tools”命名空间

    根据这里的问题 Android 布局文件中的 tools context 是什么 https stackoverflow com questions 11078487 android whats toolscontext in layout
  • Ti-Calculator 上的多语言编程

    我对在 Ti 84 plus 计算器上使用除 Ti Basic 之外的不同语言 如 Java C 和 Python 进行编程感兴趣 我的计算器是否支持此功能 如果不支持 市场上是否有任何计算器可以执行此操作 提前致谢 这个想法是 当我在家无
  • NSTimer 计时器WithTimeInterval:不工作

    在我的项目中实现之前 我已经创建了一个带有计时器的测试应用程序 这是我第一次使用计时器 但问题是当我使用计时器实现时 NSTimer timerWithTimeInterval target selector userInfo repeat
  • git 仓库中 Composer 包冲突;如何在推送到远程时取消跟踪文件但避免删除文件

    我通过 Composer 在我的 Web 应用程序上安装了一个包 并将包文件夹添加到 gitignore 同时提交composer json and composer lock 为了部署到我们的服务器 我们推送到服务器上的裸 Git 远程服
  • 如何延迟 AngularJS 即时搜索?

    我有一个似乎无法解决的性能问题 我有一个即时搜索 但它有点滞后 因为它开始搜索每个keyup JS var App angular module App App controller DisplayController function s
  • C++中高效比较字符串的方法

    像这样将一个字符串与另一个字符串或字符串文字进行比较是否有效 string a string b if a test or if a b 我的同事让我使用 memcmp 对此有何评论 Thanks Yes use a b 不要听你的同事的话
  • 如何在 Docker Compose 中初始化 MySql 数据库

    设想 我在 Spring 中开发了一个微服务 它使用 mysql 8 数据库 该数据库必须初始化 创建数据库 一些表和数据 在我的主机上 我使用 data sql 和 schema sql 脚本初始化了数据库 问题是 我必须设置 sprin