【问题标题】:testcontainers mysql DB failed when population DB填充数据库时,testcontainers mysql DB 失败
【发布时间】:2022-01-20 10:55:49
【问题描述】:

我正在尝试使用测试容器运行集成测试。 午餐测试具有以下属性:

 MySQLContainer database = (MySQLContainer) new MySQLContainer("mysql:8.0.27")
                .withUsername("test")
                .withPassword("test")
                .withEnv("MYSQL_ROOT_PASSWORD", "test")
                .withReuse(true);
        database.withInitScript("init.sql");
        database.start();

但运行脚本时失败:用户'test'@'%'拒绝访问数据库'test_scheme'

init.sql 脚本包含用于创建多个 DB 的命令

CREATE SCHEMA IF NOT EXISTS test_scheme
CREATE SCHEMA IF NOT EXISTS onothere_scheme

【问题讨论】:

    标签: java mysql testcontainers


    【解决方案1】:

    根据错误消息判断,您是以用户“test”而不是“root”身份连接的。 在这种情况下,您必须在初始化脚本中添加类似这样的内容:

    GRANT ALL PRIVILEGES ON test_scheme.* TO 'test'@'%'
    

    由于您仅将其用于测试目的,因此授予所有权限应该没问题。当然,例如,如果您只想启用读取访问权限,您可以减少这种情况。

    您也可以通过以 root 用户身份连接来完全避免这种情况,默认情况下该用户有权访问所有架构。

    【讨论】:

    • 是的,这是我试图做的,但它说用户不允许 GRANT 命令。使用 root 用户名解决了问题
    【解决方案2】:

    以下工作:

    @Test
    public void testExplicitInitScript() throws Exception {
        try (MySQLContainer<?> container = new MySQLContainer<>(DockerImageName.parse("mysql:8.0.24"))
                .withUsername("root").withPassword("")
                .withInitScript("init_mysql.sql")
                .withLogConsumer(new Slf4jLogConsumer(log))) {
            container.start();
    
        }
    }
    

    src/test/resources/init_mysql.sql

    CREATE SCHEMA IF NOT EXISTS test_scheme
    CREATE SCHEMA IF NOT EXISTS onothere_scheme
    

    【讨论】:

    • 是的,它是有效的。使用 root 用户名会有所帮助。谢谢
    • 很高兴帮助@saltex
    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 2016-07-07
    • 2012-07-22
    • 2021-03-09
    • 1970-01-01
    • 2020-03-05
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多