代码之家  ›  专栏  ›  技术社区  ›  Naftis

从ASP.NET Core 2 Web应用程序连接到MySQL8

  •  0
  • Naftis  · 技术社区  · 6 年前

    我正在尝试使用Docker撰写脚本从我的ASP.NET Core 2.1 Web应用程序(托管在Windows 10 Pro上,所有容器都使用Linux)连接到MySQL容器,但我始终 无法连接到任何指定的MySQL主机 错误。

    该应用程序使用两个服务,一个MongoDB容器和一个MySQL容器(使用最新的Docker映像和MySQL8)。API应用程序使用bash脚本等待MongoDB服务( https://github.com/vishnubob/wait-for-it ,这似乎有效。

    至于mysql,在谷歌上搜索我添加的解决方案:

    我也遵循了以下建议: https://github.com/docker-library/mysql/issues/275 :我可以确认mysql根用户链接到任何IP( % ,而服务的IP地址配置为 * 这似乎是表示“任意地址”的另一种方式,如0.0.0.0。

    开始撰写时收到的相关日志消息和Docker撰写脚本如下( lexminapi 正在记录接收的环境变量以检查连接字符串):

       lexmin-mysql    | [Entrypoint] MySQL Docker Image 8.0.13-1.1.8
       lexmin-mysql    | [Entrypoint] Initializing database
       lexmin-mysql    | 2018-11-20T07:59:11.930174Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.13) initializing of server in progress as process 21
       lexminapi_1     | ZAX__CONNECTIONSTRING=Server=lexmin-mysql;Database=zax_master;Uid=root;Pwd=password;SslMode=none
       lexmin-mysql    | 2018-11-20T07:59:22.077828Z 5 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
       lexminapi_1     | Application startup exception: MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts.
       lexminapi_1     |    at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, ILoadBalancer loadBalancer, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 322
       lexminapi_1     |    at MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection connection, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ConnectionPool.cs:line 112
       lexminapi_1     |    at MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection connection, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ConnectionPool.cs:line 141
       lexminapi_1     |    at MySql.Data.MySqlClient.MySqlConnection.CreateSessionAsync(Nullable`1 ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 405
       lexminapi_1     |    at MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Nullable`1 ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 175
       lexminapi_1     |    at MySql.Data.MySqlClient.MySqlConnection.Open() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 161
       lexminapi_1     |    at Zax.MySql.MySqlZaxAdmin.EnsureCatalogExists()
       lexminapi_1     |    at LexminApi.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env) in /src/LexminApi/Startup.cs:line 310
       lexminapi_1     | --- End of stack trace from previous location where exception was thrown ---
       lexminapi_1     |    at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder app)
       lexminapi_1     |    at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
       lexminapi_1     |    at Microsoft.AspNetCore.Hosting.Internal.AutoRequestServicesStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder builder)
       lexminapi_1     |    at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
       lexminapi_1     | Unable to connect to any of the specified MySQL hosts.
       lexminapi_1     | MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts.
       lexminapi_1     |    at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, ILoadBalancer loadBalancer, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 322
       lexminapi_1     |    at MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection connection, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ConnectionPool.cs:line 112
       lexminapi_1     |    at MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection connection, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ConnectionPool.cs:line 141
       lexminapi_1     |    at MySql.Data.MySqlClient.MySqlConnection.CreateSessionAsync(Nullable`1 ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 405
       lexminapi_1     |    at MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Nullable`1 ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 175
       lexminapi_1     |    at MySql.Data.MySqlClient.MySqlConnection.Open() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 161
       lexminapi_1     |    at Zax.MySql.MySqlZaxAdmin.EnsureCatalogExists()
       lexminapi_1     |    at LexminApi.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env) in /src/LexminApi/Startup.cs:line 310
       lexminapi_1     | --- End of stack trace from previous location where exception was thrown ---
       lexminapi_1     |    at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder app)
       lexminapi_1     |    at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
       lexminapi_1     |    at Microsoft.AspNetCore.Hosting.Internal.AutoRequestServicesStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder builder)
       lexminapi_1     |    at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
       lexminapi_1     |    at Microsoft.AspNetCore.Hosting.Internal.WebHost.StartAsync(CancellationToken cancellationToken)
       lexminapi_1     |    at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token, String shutdownMessage)
       lexminapi_1     |    at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token)
       lexminapi_1     |    at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host)
       lexminapi_1     |    at LexminApi.Program.Main(String[] args) in /src/LexminApi/Program.cs:line 64
       lexmin-mysql    | 2018-11-20T07:59:25.515319Z 5 [Warning] [MY-010315] [Server] 'user' entry 'mysql.infoschema@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:25.515408Z 5 [Warning] [MY-010315] [Server] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:25.515434Z 5 [Warning] [MY-010315] [Server] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:25.515458Z 5 [Warning] [MY-010315] [Server] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:25.515505Z 5 [Warning] [MY-010323] [Server] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:25.515540Z 5 [Warning] [MY-010323] [Server] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:25.515570Z 5 [Warning] [MY-010311] [Server] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:25.515826Z 5 [Warning] [MY-010330] [Server] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:25.515846Z 5 [Warning] [MY-010330] [Server] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:27.343300Z 0 [System] [MY-013170] [Server] /usr/sbin/mysqld (mysqld 8.0.13) initializing of server has completed
       lexmin-mysql    | [Entrypoint] Database initialized
       lexmin-mysql    | 2018-11-20T07:59:30.122415Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.13) starting as process 67
       lexmin-mysql    | 2018-11-20T07:59:31.233579Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
       lexmin-mysql    | 2018-11-20T07:59:31.270181Z 0 [Warning] [MY-010315] [Server] 'user' entry 'mysql.infoschema@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:31.270517Z 0 [Warning] [MY-010315] [Server] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:31.270675Z 0 [Warning] [MY-010315] [Server] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:31.270818Z 0 [Warning] [MY-010315] [Server] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:31.271038Z 0 [Warning] [MY-010323] [Server] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:31.272659Z 0 [Warning] [MY-010323] [Server] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:31.272734Z 0 [Warning] [MY-010311] [Server] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:31.285399Z 0 [Warning] [MY-010330] [Server] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:31.286316Z 0 [Warning] [MY-010330] [Server] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:31.299467Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.13'  socket: '/var/lib/mysql/mysql.sock'  port: 0  MySQL Community Server - GPL.
       lexmin-mysql    | 2018-11-20T07:59:31.474623Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock'
       lexmin-mysql    | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
       lexmin-mysql    | Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
       lexmin-mysql    | Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
       lexmin-mysql    | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
       lexmin-mysql    | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
       lexmin-mysql    | 2018-11-20T07:59:37.721908Z 9 [Warning] [MY-010315] [Server] 'user' entry 'healthchecker@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:37.721967Z 9 [Warning] [MY-010315] [Server] 'user' entry 'mysql.infoschema@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:37.721997Z 9 [Warning] [MY-010315] [Server] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:37.722022Z 9 [Warning] [MY-010315] [Server] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:37.722068Z 9 [Warning] [MY-010315] [Server] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:37.722135Z 9 [Warning] [MY-010323] [Server] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:37.722157Z 9 [Warning] [MY-010323] [Server] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:37.722203Z 9 [Warning] [MY-010311] [Server] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:37.722596Z 9 [Warning] [MY-010330] [Server] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:37.722642Z 9 [Warning] [MY-010330] [Server] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 
       lexmin-mysql    | [Entrypoint] ignoring /docker-entrypoint-initdb.d/*
       lexmin-mysql    | 
       lexmin-mysql    | 2018-11-20T07:59:37.765710Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.13).
       lexmin-mysql    | 2018-11-20T07:59:40.346144Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.13)  MySQL Community Server - GPL.
       lexmin-mysql    | [Entrypoint] Server shut down
       lexmin-mysql    | 
       lexmin-mysql    | [Entrypoint] MySQL init process done. Ready for start up.
       lexmin-mysql    | 
       lexmin-mysql    | [Entrypoint] Starting MySQL 8.0.13-1.1.8
       lexmin-mysql    | 2018-11-20T07:59:41.244150Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.13) starting as process 1
       lexmin-mysql    | 2018-11-20T07:59:42.257165Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
       lexmin-mysql    | 2018-11-20T07:59:42.286105Z 0 [Warning] [MY-010315] [Server] 'user' entry 'healthchecker@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:42.286148Z 0 [Warning] [MY-010315] [Server] 'user' entry 'mysql.infoschema@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:42.286179Z 0 [Warning] [MY-010315] [Server] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:42.286210Z 0 [Warning] [MY-010315] [Server] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:42.286236Z 0 [Warning] [MY-010315] [Server] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:42.286296Z 0 [Warning] [MY-010323] [Server] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:42.286318Z 0 [Warning] [MY-010323] [Server] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:42.286349Z 0 [Warning] [MY-010311] [Server] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:42.292963Z 0 [Warning] [MY-010330] [Server] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:42.293011Z 0 [Warning] [MY-010330] [Server] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
       lexmin-mysql    | 2018-11-20T07:59:42.303034Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.13'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server - GPL.
       lexmin-mysql    | 2018-11-20T07:59:42.329828Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060
       lexminapi_1     | Application is shutting down...
    

    脚本:

       version: '3.4'
    
       services:
         # MongoDB
         lexmin-mongo:
           image: mongo
           container_name: lexmin-mongo
           environment:
             - MONGO_DATA_DIR=/data/db
             - MONGO_LOG_DIR=/dev/null
           ports:
             - 27017:27017
           command: mongod --smallfiles --logpath=/dev/null # --quiet
           ports:
             - 27017:27017
           networks:
             - lexmin-network
    
         # MySql
         lexmin-mysql:
           image: mysql/mysql-server
           container_name: lexmin-mysql
           command: --default-authentication-plugin=mysql_native_password
           environment:
             - MYSQL_ROOT_PASSWORD=password
             - MYSQL_ROOT_HOST=%
           ports:
             - 3306:3306
           networks:
             - lexmin-network
    
         lexminapi:
           image: XXX:lexminapi
           ports:
             - 34577:80
           depends_on:
             - lexmin-mongo
             - lexmin-mysql
           command: ["./wait-for-it.sh", "lexmin-mongo:27017", "--", "dotnet", "LexminApi.dll"]
           environment:
             # for Windows use : as separator, for non Windows use __
             # (see https://github.com/aspnet/Configuration/issues/469)
             - ZAX__CONNECTIONSTRING=Server=lexmin-mysql;Database=zax_master;Uid=root;Pwd=password;SslMode=none
           networks:
             - lexmin-network
    
       networks:
         lexmin-network
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Naftis    6 年前

    我终于找到了一个解决方案,包括对上面的两个更改:

    1. 在配置mysql环境变量时,我们似乎必须使用字典而不是数组,如 connecting to a docker-compose mysql container denies access but docker running same image does not . 所以我像这样改变了我的作曲家:

    environment:
          # the password that will be set for the MySQL root superuser account
          MYSQL_ROOT_PASSWORD: password
          MYSQL_ROOT_HOST: '%'
    

    注意使用字典需要 % 在引号之间,否则您将得到一个yaml错误。

    1. 一旦像上面所说的那样改变,我会得到间歇性的结果:有时应用程序会启动,但大多数时候它仍然有一个连接错误。当这指向超时问题时,我在谷歌上搜索了一个好的重试模式,发现 Polly .因此,我将mysql种子代码包装成一个polly Execute 方法,如下所示:

    Policy.Handle()
        .WaitAndRetry(new[]
        {
            TimeSpan.FromSeconds(10),
            TimeSpan.FromSeconds(30),
            TimeSpan.FromSeconds(60)
        }, (exception, timeSpan, context) =>
        {
            string message = $"Unable to connect to MySql (sleep {timeSpan}): {exception.Message}";
            Console.WriteLine(message);
        }).Execute(() =>
    {
      // ... MySql init code here...
    });
    

    请注意,在ASP.NET核心2中播种的正确位置是 Startup.cs 参见 How to seed in Entity Framework Core 2? .

    当我启动应用程序时,我现在可以看到第一次超时为10”,然后触发重试,直到应用程序启动而不退出,因为 MySqlException .