当前位置: 首页 > 知识库问答 >
问题:

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

黄俊智
2023-03-14

场景:我在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中的副本中。所以我不是专家,但我正在寻找一个很好的解决方案:

  • 从spring中初始化数据库,并让我的服务等待mysql就绪
  • 或者在第一次运行时通过卷从withn my container初始化数据库,当然可以解决这个初始化问题

我不知道这里的最佳实践是什么,我和我将非常感谢一些帮助如何建立这一点。

共有1个答案

仲孙昊焱
2023-03-14

只在第一次运行时加载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

您必须使用Volumesdata.sqlschema.sql文件放置在/docker entrypoint initdb.d目录下,以了解更多信息。

仅当数据库的数据目录为空时(第一次运行数据库服务),才会加载此文件夹中的SQL文件。(即)在您的情况下,/mysql data文件夹应为空

关于第二个问题:

您可以使用healthcheckservice\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的新手,我不明白如何将其放入