From 34c2bc784eb503e2c17cd662fb1eca63484b74b4 Mon Sep 17 00:00:00 2001 From: Ivan Stanislavciuc Date: Wed, 31 Mar 2021 17:24:57 +0200 Subject: [PATCH 1/5] Fix problem of starting up mysql 5.7.33 version when user is root Fixes following problem in console of mysql container [ERROR] [Entrypoint]: MYSQL_USER="root", MYSQL_USER and MYSQL_PASSWORD are for configuring a regular user and cannot be used for the root user Remove MYSQL_USER="root" and use one of the following to control the root user password: - MYSQL_ROOT_PASSWORD - MYSQL_ALLOW_EMPTY_PASSWORD - MYSQL_RANDOM_ROOT_PASSWORD --- .../testcontainers/containers/MySQLContainer.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java index 1dc235e6536..ae330db6030 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java @@ -49,7 +49,7 @@ public MySQLContainer(final DockerImageName dockerImageName) { dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); - addExposedPort(MYSQL_PORT); + addExposedP ort(MYSQL_PORT); } @@ -62,10 +62,12 @@ protected Set getLivenessCheckPorts() { @Override protected void configure() { optionallyMapResourceParameterAsVolume(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, "/etc/mysql/conf.d", - "mysql-default-conf"); + "mysql-default-conf"); addEnv("MYSQL_DATABASE", databaseName); - addEnv("MYSQL_USER", username); + if (!MYSQL_ROOT_USER.equalsIgnoreCase(username)) { + addEnv("MYSQL_USER", username); + } if (password != null && !password.isEmpty()) { addEnv("MYSQL_PASSWORD", password); addEnv("MYSQL_ROOT_PASSWORD", password); @@ -98,12 +100,12 @@ public String getJdbcUrl() { protected String constructUrlForConnection(String queryString) { String url = super.constructUrlForConnection(queryString); - if (! url.contains("useSSL=")) { + if (!url.contains("useSSL=")) { String separator = url.contains("?") ? "&" : "?"; url = url + separator + "useSSL=false"; } - if (! url.contains("allowPublicKeyRetrieval=")) { + if (!url.contains("allowPublicKeyRetrieval=")) { url = url + "&allowPublicKeyRetrieval=true"; } From d099862017b35c4ecb03104fbd6527adac0b9581 Mon Sep 17 00:00:00 2001 From: Ivan Stanislavciuc Date: Wed, 31 Mar 2021 17:25:59 +0200 Subject: [PATCH 2/5] Fix typo --- .../main/java/org/testcontainers/containers/MySQLContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java index ae330db6030..a126a579489 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java @@ -49,7 +49,7 @@ public MySQLContainer(final DockerImageName dockerImageName) { dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); - addExposedP ort(MYSQL_PORT); + addExposedPort(MYSQL_PORT); } From 32a7629056f350f34e8846ecef302c9dcfe690b3 Mon Sep 17 00:00:00 2001 From: Ivan Stanislavciuc Date: Fri, 9 Apr 2021 09:11:31 +0200 Subject: [PATCH 3/5] Add test that checks root account usage for mysql version 8 and 5 --- .../containers/MySQLRootAccountTest.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java diff --git a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java new file mode 100644 index 00000000000..279a5bea7b6 --- /dev/null +++ b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java @@ -0,0 +1,52 @@ +package org.testcontainers.containers; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.testcontainers.containers.output.Slf4jLogConsumer; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +@Slf4j +@RunWith(Parameterized.class) +public class MySQLRootAccountTest { + + @Parameterized.Parameters(name = "{0}") + public static String[] params() { + return new String[]{ + "mysql:8", + "mysql:5" + }; + } + + @Parameterized.Parameter() + public String image; + + @Test + public void testRootAccountUsageWithDefaultPassword() throws SQLException { + testWithDB(new MySQLContainer<>(image).withUsername("root")); + } + + @Test + public void testRootAccountUsageWithEmptyPassword() throws SQLException { + testWithDB(new MySQLContainer<>(image).withUsername("root").withPassword(null)); + } + + @Test + public void testRootAccountUsageWithCustomPassword() throws SQLException { + testWithDB(new MySQLContainer<>(image).withUsername("root").withPassword("not-default")); + } + + private void testWithDB(MySQLContainer db) throws SQLException { + try { + db.withLogConsumer(new Slf4jLogConsumer(log)).start(); + Connection connection = DriverManager.getConnection(db.getJdbcUrl(), db.getUsername(), db.getPassword()); + connection.createStatement().execute("SELECT 1"); + } finally { + db.close(); + } + } +} From 03151ea468ac52f8578a85c7c7b1d80cde3e1cb4 Mon Sep 17 00:00:00 2001 From: Ivan Stanislavciuc Date: Sat, 10 Apr 2021 23:01:56 +0200 Subject: [PATCH 4/5] Use empty string instead of null password --- .../org/testcontainers/containers/MySQLRootAccountTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java index 279a5bea7b6..9319f2fe514 100644 --- a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java @@ -32,7 +32,7 @@ public void testRootAccountUsageWithDefaultPassword() throws SQLException { @Test public void testRootAccountUsageWithEmptyPassword() throws SQLException { - testWithDB(new MySQLContainer<>(image).withUsername("root").withPassword(null)); + testWithDB(new MySQLContainer<>(image).withUsername("root").withPassword("")); } @Test From 8b76f3fc4e007b2a7b7a9e20715cec5005f6a057 Mon Sep 17 00:00:00 2001 From: Ivan Stanislavciuc <2766429+seveneves@users.noreply.github.com> Date: Sun, 11 Apr 2021 10:34:59 +0200 Subject: [PATCH 5/5] Add check that root account is used Co-authored-by: Richard North --- .../java/org/testcontainers/containers/MySQLRootAccountTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java index 9319f2fe514..c437acac013 100644 --- a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java @@ -45,6 +45,7 @@ private void testWithDB(MySQLContainer db) throws SQLException { db.withLogConsumer(new Slf4jLogConsumer(log)).start(); Connection connection = DriverManager.getConnection(db.getJdbcUrl(), db.getUsername(), db.getPassword()); connection.createStatement().execute("SELECT 1"); + connection.createStatement().execute("set sql_log_bin=0"); // requires root } finally { db.close(); }