【问题标题】:Unable to connect to MySQL running inside a Docker container (configured using docker-maven-plugin)无法连接到在 Docker 容器内运行的 MySQL(使用 docker-maven-plugin 配置)
【发布时间】:2020-10-12 05:26:10
【问题描述】:

我在连接到在 Docker 容器中运行的 MySQL 服务器时遇到问题。这是docker-maven-plugin 配置。

<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.34.1</version>
    <extensions>true</extensions>
    <configuration>
        <images>
            <image>
                <alias>database</alias>
                <name>mysql:8.0</name>
                <run>
                    <log>
                        <prefix>TC</prefix>
                        <date>default</date>
                        <color>cyan</color>
                    </log>
                    <wait>
                        <log>mysqld: ready for connections</log>
                        <time>750000</time>
                    </wait>
                    <env>
                        <MYSQL_ROOT_PASSWORD>${test.database.password}</MYSQL_ROOT_PASSWORD>
                        <MYSQL_DATABASE>${test.database.name}</MYSQL_DATABASE>
                        <MYSQL_USER>${test.database.username}</MYSQL_USER>
                        <MYSQL_PASSWORD>${test.database.password}</MYSQL_PASSWORD>
                    </env>
                    <ports>
                        <port>3308:3306</port>
                    </ports>
                </run>
            </image>
        </images>
    </configuration>
    <executions>
        <execution>
            <id>docker:start</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>start</goal>
            </goals>
        </execution>
        <execution>
            <id>docker:stop</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>stop</goal>
            </goals>
        </execution>
    </executions>
</plugin>

我在日志中看到 MySQL 启动成功:

04:20:18.583 TC2020-10-12T04:20:18.583211Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
[INFO] DOCKER> Pattern 'mysqld: ready for connections' matched for container 2f7f66ba896c
04:20:18.611 TC2020-10-12T04:20:18.610295Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.21'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server - GPL.
04:20:18.625 TC2020-10-12 04:20:18+00:00 [Note] [Entrypoint]: Temporary server started.
04:20:23.415 TCWarning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
[INFO] DOCKER> [mysql:8.0] "database": Waited on log out 'mysqld: ready for connections' 172861 ms
04:20:23.415 TCWarning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.

通过 JDBC 连接时出错,maven-failsafe-plugin 连接失败:我尝试连接 localhost:3308、127.0.0.1:3308、0.0.0.0:3308 和 10.0.75.0:3308。另外,尝试了网络类型,bridge、host 和 container。

04:20:31.697 TCWarning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
04:20:31.697 TCWarning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
.09:50:31.962 [main] INFO  com.zaxxer.hikari.HikariDataSource - jdbc:mysql://localhost:3308/test_db_name?useSSL=false&trustServerCertificate=false&serverSslCert= - Starting... 
.09:50:33.291 [main] ERROR com.zaxxer.hikari.pool.HikariPool - jdbc:mysql://localhost:3308/test_db_name?useSSL=false&trustServerCertificate=false&serverSslCert= - Exception during pool initialization. 
java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=localhost)(port=3308)(type=master) : Could not connect to localhost:3308 : unexpected end of stream, read 0 bytes from 4 (socket was closed by server)
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73)
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:192)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1346)
    at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:634)
    at org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:150)
    at org.mariadb.jdbc.Driver.connect(Driver.java:89)
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:354)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:473)
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:554)

Docker 网络配置:

【问题讨论】:

    标签: mysql docker maven


    【解决方案1】:

    主要是mysql版本。

    如果您尝试使用 mysql:5.7,它可能会起作用

    安全要求在以后的版本中有所不同。

    它可以被禁用

    default_authentication_plugin=mysql_native_password

    但我不知道将它放在 docker-maven-plugin 的哪个位置。

    【讨论】:

    • 终于mysql:5.7 工作了。我没有尝试禁用此default_authentication_plugin。问题是在容器中 MySQL 在日志中打印了两次 mysqld: ready for connections。最终打印在Temporary server stopped 之后。在此之前的任何连接尝试都将导致失败。更好的选择是在日志中检查MySQL init process done. Ready for start up.,因为它只打印一次。
    猜你喜欢
    • 2020-10-15
    • 1970-01-01
    • 2021-07-02
    • 2017-11-03
    • 2016-04-26
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    相关资源
    最近更新 更多