Как я могу подключиться к базе данных MySQL в контроллере ASP.NET API (.Net 8). Оба работают в отдельном докер-контейнере.
Вот мой docker-compose.yml:
version: '3.4'
services:
database:
container_name: DB
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_DATABASE=db
- MYSQL_USER=user
- MYSQL_PASSWORD=secretpassword
- MYSQL_ALLOW_EMPTY_PASSWORD=1
volumes:
- dbdata:/var/lib/mysql
- ./MySqlScripts/init.sql:/docker-entrypoint-initdb.d/1.sql:ro
restart: on-failure
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 10
ports:
- 3306:3306
command: --default-authentication-plugin=mysql_native_password
api:
container_name: API
build:
context: .
dockerfile: API/Dockerfile
ports:
- 5092:8080
depends_on:
- database
volumes:
dbdata:
Я хочу использовать MySql.Data (NuGet-Package).
Я пытался установить соединение с этой конфигурацией файла docker-compose, но это всегда приводило к следующему:
«Нет доступного хоста MySQL».






Сначала вы должны добавить контроллер в свой API или создать конечную точку следующим образом:
// here is only the endpoint
[HttpGet]
[Route("dbcheck")]
public IActionResult DbConnect() {
return Ok();
}
Затем добавьте MySqlConnection из NuGet.
string connectionString = "";
MySqlConnection connection = new MySqlConnection(connectionString)
Как видите, вам необходимо определить строку (connectionString). К содержимому этой строки я добавил следующий интерфейс для чтения настроек в appsettings.json. (см. ниже, покажу позже)
private readonly IConfiguration Configuration;
public NameOfTheController(IConfiguration configuration) {
Configuration = configuration;
}
Теперь его можно использовать вот так, а также вы можете увидеть первую команду SQL:
string connectionString = Configuration["ConnectionStrings:essenskasse"] ?? "";
MySqlConnection connection = new MySqlConnection(connectionString)
MySqlCommand command = new MySqlCommand("SELECT * FROM Test", con);
После этого соединение может быть установлено. Чтобы выполнить команду, используйте MySqlDataReader и заполните результат чтения в DataTable:
connection.Open();
MySqlDataReader reader = command.ExecuteReader();
DataTable dataTable = new DataTable();
dataTable.Load(reader);
reader.Close();
connection.Close();
Не забудьте в конце Connection.Close()!
Вот полный демо-контроллер:
using Microsoft.AspNetCore.Mvc;
using MySql.Data.MySqlClient;
using System.Data;
namespace API.Controllers {
[Route("api/[controller]")]
[ApiController]
public class DemoController : ControllerBase {
private readonly IConfiguration Configuration;
public DemoController(IConfiguration configuration) {
Configuration = configuration;
}
[HttpGet, Route("dbcheck")]
public IActionResult DbConnect() {
try {
MySqlConnection connection = new MySqlConnection(Configuration["ConnectionStrings:mysql"]);
MySqlCommand command = new MySqlCommand("SELECT * FROM Test", connection);
connection.Open();
MySqlDataReader reader = command.ExecuteReader();
DataTable dataTable = new DataTable();
dataTable.Load(reader);
reader.Close();
connection.Close();
return Ok();
}
catch (Exception ex) {
return BadRequest(ex.ToString());
}
}
}
}
А вот appsettings.json для API:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"mysql": "Server=database;Port=3306;Uid=user;Pwd=secretpassword;Database=db;SslMode=None;"
}
}
SslMode=None используется, потому что: https://stackoverflow.com/a/78042591
Вы также не можете подключиться к localhost:3306 в контексте докера. Вместо этого вам следует использовать имя службы, у вас было имя базы данных, поэтому я вставляю его.