Невозможно подключить Asp. net Core WebApi в Docker с поставщиком EFCore Mysql к не Docker Mysql на хост-сервере. - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть Asp. Net Core 3.1.3 WebApi с EfCore 3.1.3 и Pomelo.EntityFrameworkCore. MySql в качестве поставщика Этот WebApi построен и развернут в Docker.

Хост-сервер Debian 10, он настроен с UFW в качестве брандмауэра.

У меня установлен Mysql Сервер, установленный на хост-сервере.

Я установил адрес привязки 0.0.0.0 для Mysql

/ etc / mysql / mysql .conf.d / mysqld.cnf

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
bind-address    = 0.0.0.0

Я создал правило в UFW, разрешающее только локальный хост и docker0 bridge ip адрес enter image description here

enter image description here

В моей конфигурации docker, я добавил IP-адрес моего хост-сервера, но соединение с MySql не удается

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 3.1.3 initialized 'ApplicationContext' using provider 'Pomelo.EntityFrameworkCore.MySql' with options: using lazy-loading proxies ServerVersion 8.0.19 MySql 
fail: Microsoft.EntityFrameworkCore.Database.Connection[20004]
An error occurred using the connection to database '<db_name>' on server '<host_ip_address>'.
info: Microsoft.EntityFrameworkCore.Infrastructure[10404]
A transient exception has been encountered during execution and the operation will be retried after 0ms.
MySql.Data.MySqlClient.MySqlException (0x80004005): Connect Timeout expired.
---> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.

В файле Startup.cs приведен конфиг для EfCore:

services.AddDbContext<ApplicationContext>(opts =>
      {
        opts
        .UseLazyLoadingProxies()
        .UseMySql(connectionString, mySqlOptions =>
                    mySqlOptions
                      .ServerVersion(new Version(dbOptions.Version), ServerType.MySql)
                      .CharSet(CharSet.Utf8Mb4)
                      .EnableRetryOnFailure(3))
        .EnableDetailedErrors();
      });

Для построения строки подключения я использую MySql. Data.MySqlClient.MySqlConnectionStringBuilder:

var builder = new MySql.Data.MySqlClient.MySqlConnectionStringBuilder
      {
        Server = dbOptions.Server,
        Database = dbOptions.Name,
        UserID = dbOptions.User,
        Password = dbOptions.Password,       
        PersistSecurityInfo = true
      };

      return builder.ToString();

Я сгенерировал сценарий миграции и развернул его на сервере, так как Pomelo устанавливает имя базы данных как пустую строку при вызове dbCon text.Database.Migrate ();

В файле docker я предоставляю порты 80 и 443.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
...

Я отправил параметры базы данных как переменные среды в файле docker -compose.

Я выполнил некоторые операции по заполнению данных, чтобы добавить пользователей и роли из Identity.

var roleManager = provider.GetRequiredService<RoleManager<RoleModel>>();
roleManager.CreateAsync(new RoleModel(roleName)).GetAwaiter().GetResult();
...

Что я пропустил?

1 Ответ

0 голосов
/ 06 апреля 2020

Я не нашел другого решения, кроме как развернуть мой docker контейнер с использованием режима хост-сети в моем docker -compose.

docker -compose.yml

services:
  <service_name>:
    image: <image_name>
    network_mode: "host" #important here
    ports:
      - "5000:5000"
      - "5001:5001"
    environment:
      ASPNETCORE_Kestrel__Certificates__Default__Password: "${ASPNETCORE_KESTREL_CERTIFICATE_PASSWORD}"
      ASPNETCORE_Kestrel__Certificates__Default__Path: "${ASPNETCORE_KESTREL_CERTIFICATE_PATH}"
      ASPNETCORE_ENVIRONMENT: Production
      "Database:Server": "${Database_Server}"
      "Database:Version": "${Database_Version}"
      "Database:Name": "${Database_Name}"
      "Database:User": "${Database_User}"
      "Database:Password": "${Database_Password}"
    build:
      context: ./Src
      dockerfile: Dockerfile-build
    volumes:
      - ${CERTIFICATE_PATH}:/https
      - ${LOGS_PATH}:/app/logs

В этом случае мне просто нужно использовать IP-адрес хост-сервера для подключения к MySql (со всей конфигурацией Ufw, MySql, которая идет с этим).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...